【问题标题】:pthreads: How to handle signals in a main thread that creates other threads? (specific code shown)pthreads:如何处理创建其他线程的主线程中的信号? (具体代码如图)
【发布时间】:2010-12-11 18:38:54
【问题描述】:

我有一个主线程,它保留在主函数中,即我没有像在 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,它创建并加入所有其他线程,所以我不明白这段代码是否完全转到所有完成/调用以启动程序的 main 函数。如果我把它放在一个线程上,用这段代码和要清理的处理程序,这是否被认为是忙等待?

【问题讨论】:

    标签: c multithreading thread-safety pthreads signals


    【解决方案1】:

    “它说”?说什么?家庭作业?

    关于使用线程和信号进行编程,您首先应该了解的是,您几乎无法控制将信号传递到哪个线程。如果你的主线程想成为获取信号的那个,它应该在创建任何新线程之前阻塞信号,并可能在完成创建它们后解除阻塞,以确保信号不会传递给它们。

    但是,如果您遵循信号处理程序的最佳做法,那么处理信号的线程可能并不重要。信号处理程序应该做的就是设置一个全局标志或向管道写入一个字节(以最有效的方式让主线程注意到信号发生了。(请注意,您不能使用条件变量或来自信号处理程序的任何锁定原语!)与您问题中的代码片段一样,阻塞信号并使用 sigwait 也是可能的(再次注意,它需要在 所有 线程中被阻塞),但大多数程序不能只等待信号;它们还需要等待条件变量和/或文件输入。解决此问题的一种方法是创建一个专用线程来调用sigwait , 但这相当浪费。如果您已经在使用select,更好的解决方案是切换到可以等待信号以及文件描述符事件(同时)的pselect

    与其向我们询问答案(如果没有看到您尝试使用的完整程序,无论如何都很难给出答案),您最好尝试真正理解信号的复杂性线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-29
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 2013-12-02
      • 2018-06-30
      • 2010-10-29
      相关资源
      最近更新 更多