pthread_kill结束调用程序

时间:2013-06-03 06:10:48

标签: pthreads kill

我正在研究 Ubuntu 12.04.2 LTS。我对pthread_kill()有一个奇怪的问题。仅将"Create thread 0!"写入标准输出后,以下程序结束。程序以退出状态138结束。

如果我取消注释"usleep(1000);"一切正常执行。为什么会这样?

#include <nslib.h>

void *testthread(void *arg);

int main() {

    pthread_t tid[10];
    int i;

    for(i = 0; i < 10; ++i) {
        printf("Create thread %d!\n", i);
        Pthread_create(&tid[i], testthread, NULL);
        //usleep(1000);
        Pthread_kill(tid[i], SIGUSR1);
        printf("Joining thread %d!\n", i);
        Pthread_join(tid[i]);
        printf("Joined %d!", i);
    }

    return 0;
}

void sighandlertest(int sig) {

    printf("print\n");
    pthread_exit();
    //return NULL;

}

void* testthread(void *arg) {

    struct sigaction saction;

    memset(&saction, 0, sizeof(struct sigaction));
    saction.sa_handler = &sighandlertest;
    if(sigaction(SIGUSR1, &saction, NULL) != 0 ) {
        fprintf(stderr, "Sigaction failed!\n");
    }
    printf("Starting while...\n");
    while(true) {

    }

    return 0;

}

1 个答案:

答案 0 :(得分:1)

如果主线程在提升SIGUSR1之前没有睡眠,则最可能创建的线程的信号处理程序尚未设置,因此接收信号的默认操作适用,即结束过程

建议不要使用sleep()来同步线程,因为不能保证可靠。在这里使用其他技工。条件/互斥对是合适的。

声明一个全局状态变量int signalhandlersetup = 0,保护对互斥锁的访问,创建线程,使主线程使用pthread_cond_wait()等待,让创建的线程为{{设置信号句柄1}},设置SIGUSR1,然后使用signalhandlersetup = 0发出主线程正在等待的条件。最后让主线程通过您的帖子调用pthread_signal_cond()