繁体   English   中英

pthreads:如何处理创建其他线程的主线程中的信号? (显示的具体代码)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM