我正在研究 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;
}
答案 0 :(得分:1)
如果主线程在提升SIGUSR1
之前没有睡眠,则最可能创建的线程的信号处理程序尚未设置,因此接收信号的默认操作适用,即结束过程
建议不要使用sleep()
来同步线程,因为不能保证可靠。在这里使用其他技工。条件/互斥对是合适的。
声明一个全局状态变量int signalhandlersetup = 0
,保护对互斥锁的访问,创建线程,使主线程使用pthread_cond_wait()
等待,让创建的线程为{{设置信号句柄1}},设置SIGUSR1
,然后使用signalhandlersetup = 0
发出主线程正在等待的条件。最后让主线程通过您的帖子调用pthread_signal_cond()
。