我是否过度设计每线程信号阻塞?

时间:2012-11-21 17:01:12

标签: c++ pthreads boost-thread

在我的应用程序中,我通常想拦截SIGINTSIGTERM信号,以便优雅地关闭。

为了防止工作线程“窃取”信号,我在每个输入点执行此操作:

// Block signals in this thread
sigset_t signal_set;
sigaddset(&signal_set, SIGINT);
sigaddset(&signal_set, SIGTERM);
sigaddset(&signal_set, SIGHUP);
sigaddset(&signal_set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &signal_set, NULL);

如果我不这样做,当我执行 Ctrl + C 时,有些时候(未指定哪个线程会获得信号)我的处理程序在不会调用基本线程 - 相反,信号只是从工作线程中终止进程。这显然不是很酷。

所以我在其他任何地方都有一个信号处理线程和阻塞信号。

但是,我没有注意到其他任何人这样做,忘记这样做很容易,而且它也不是完全可移植的。是否有一些我想念的更简单的技巧?


参考文献:

1 个答案:

答案 0 :(得分:5)

我发现这是完全合理的事情。

在生成任何其他线程之前,您可以阻止main中的信号。生成的线程将继承创建者线程信号掩码,您只能在信号处理线程中解除阻塞信号(仅当该线程产生其他线程时才要小心)。

或者你可以在任何地方阻止信号,并通过信号处理线程中的sigwait和朋友明确处理它们。