[英]pthreads: How to handle signals in a main thread that creates other threads? (specific code shown)
我有一个主线程,它保留在main函数中,即我不像pthread_create那样专门创建它,因为它没有必要。 这个线程打开一个文件,然后创建其他线程,等待它们完成工作(即,连接),清理所有内容(指针,信号量,条件变量等等)。
现在,我必须应用此代码来阻止SIGINT:
sigset_t set;
int sig;
sigemptyset(&set);
sigaddset(&set, SIGINT);
pthread_sigmask(SIG_BLOCK, &set, NULL);
while (1) {
sigwait(&set, &sig);
switch (sig) {
case SIGINT:
/* handle interrupts */
break;
default:
/* unexpected signal */
pthread_exit((void *)-1);
}
}
它说你必须使用main()函数启动N + 1个线程并等待它们完成。 如果一个SIGINT信号到达程序,它应该由主线程处理,以便关闭程序及其线程一个干净的方式
我怀疑的是我应该如何使用此代码? 把它放在main()中创建的后台线程上是不对的? 因为我已经有了一个带有退出标志的cicle,它创建并连接所有其他线程,所以我不明白这个代码是否完全适用于所有完成/调用以启动程序的主函数。 如果我把它放在一个线程上,用这个代码和处理程序来清理,这是不是很忙呢?
“它说”? 怎么说? 家庭作业?
关于使用线程和信号进行编程,您应该首先了解的是,您几乎无法控制信号传递到哪个线程。 如果您的主要线程想要获取信号,它应该在创建任何新线程之前阻止信号,并在完成创建它们之后将其解锁,以确保信号不会传递给它们。
但是 ,如果您遵循信号处理程序的最佳实践,那么哪个线程处理信号可能无关紧要。 所有信号处理程序应该设置一个全局标志或写一个字节到一个管道(无论哪个最好使主线程注意到信号发生。(注意,您不能使用条件变量或来自信号处理程序的任何锁定原语! )正如您问题中的代码片段一样,阻塞信号和使用sigwait
也是可能的(再次注意,它需要在所有线程中被阻止),但是大多数程序都无法停止并等待信号;他们还需要等待条件变量和/或文件输入。解决这个问题的一种方法是创建一个专用线程来调用sigwait
,但这样做相当浪费。如果你已经使用了select
,那么这是一个更好的解决方案,将切换到可以等待信号和文件描述符事件的pselect
(同时)。
而不是向我们询问答案(如果没有看到你试图使这个工作的完整程序,那将很难给出答案),你会更好地尝试用线程来真正理解信号的复杂性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.