0

我正在开发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;

}
4

1 回答 1

1

如果主线程在引发 之前没有休眠一点SIGUSR1,则最可能创建的线程的信号处理程序尚未设置,因此应用接收信号的默认操作,即结束进程。

不推荐使用sleep()s 来同步线程,因为不能保证可靠。在这里使用其他机制。条件/互斥对将是合适的。

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

于 2013-06-03T11:16:26.960 回答