[英]How do I stop threads stalling on pthread_join?
我有一个项目,其中将作业添加到队列中,并且有多个线程接收作业,并计算自己的独立结果。
我的程序处理SIGINT信号,我试图加入线程以将结果加起来,打印到屏幕上,然后退出。 我的问题是,当我发送信号时,线程似乎停止运行,或者在互斥锁上被阻塞。 为了简洁起见,这是我程序的重要部分。
main.c
//the thread pool has a queue of jobs inside
//called jobs (which is a struct)
struct thread_pool * pool;
void signal_handler(int signo) {
pool->jobs->running = 0; //stop the thread pool
pthread_cond_broadcast(pool->jobs->cond);
for (i = 0; i < tpool->thread_count; i++) {
pthread_join(tpool->threads[i], retval);
//do stuff with retval
}
//print results then exit
exit(EXIT_SUCCESS);
}
int main() {
signal(SIGINT, signal_handler);
//set up threadpool and jobpool
//start threads (they all run the workerThread function)
while (1) {
//send jobs to the job pool
}
return 0;
}
thread_stuff.c
void add_job(struct jobs * j) {
if (j->running) {
pthread_mutex_lock(j->mutex);
//add job to queue and update count and empty
pthread_cond_signal(j->cond);
pthread_mutex_unlock(j->mutex);
}
}
struct job * get_job(struct jobs * j) {
pthread_mutex_lock(j->mutex);
while (j->running && j->empty)
pthread_cond_wait(j->cond, j->mutex);
if (!j->running || j->empty) return NULL;
//get the next job from the queue
//unlock mutex and send a signal to other threads
//waiting on the condition
pthread_cond_signal(j->cond);
pthread_mutex_unlock(j->mutex);
//return new job
}
void * workerThread(void * arg) {
struct jobs * j = (struct jobs *) arg;
int results = 0;
while (j->running) {
//get next job and process results
}
return results;
}
感谢您的帮助,这真让我头疼!
您不应从处理异步生成的信号(例如SIGINT
的信号处理程序中调用pthread_cond_wait
或pthread_join
。 相反,您应该为所有线程阻止SIGINT
,产生一个专用线程,然后在那里调用sigwait
。 这意味着您可以在信号处理程序上下文之外检测到SIGINT
信号的到达,因此您不仅可以使用异步信号安全函数 。 如果信号传递到工作线程之一,您还可以避免自锁的风险。
此时,您只需要有序地关闭工作队列/线程池。 根据细节的不同,您现有的带有running
标志的方法甚至可能不会改变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.