c - C中的多线程程序中哪些信号不应该被线程阻塞?

标签 c multithreading signals

我有一个多线程程序。我想在一个线程中处理所有有意义的信号。这就是我在创建任何线程之前所做的:

sigset_t signal_set, old_set;

sigfillset(&signal_set);
// What signals should I leave unblocked here?
pthread_sigmask(SIG_SETMASK, &signal_set, &old_set);

std::thread( /* some args */ );

pthread_sigmask(SIG_SETMASK, &old_set, nullptr);

但我的理智建议让一些信号畅通无阻,因为在很多情况下信号可能会直接发送到特定线程:SIGSEGVSIGPROF - 我相信,这与在交互式程序中保留未阻塞的 SIGINT 一样好。


我对这两个信号(SIGSEGVSIGPROF)的建议是否正确?

根据一些常识,我应该畅通哪些其他信号?

最佳答案

异步信号(这是其中的大部分,包括由 kill 命令/函数发送的任何信号和由控制终端生成的信号,如 SIGINT)可交付给任何线程信号畅通的进程,因此无需在所有线程中保持它们畅通。如果您使用专用的信号处理线程,您希望它们在除信号处理线程之外的所有线程中被阻塞。

另一方面,同步信号作为该线程的操作的结果传递到特定线程。它们包括SIGPIPESIGBUSSIGSEGVSIGFPE等。SIGPIPE除外, 除非你的程序中有严重的错误,否则这些都不会发生,并且你可能想阻止 SIGPIPE 所以你可以得到 EPIPE 错误并处理这个状况良好。所以在大多数情况下,我会说完全阻止它们并没有什么坏处。如果您真的发现自己需要处理 SIGSEGV 或类似的东西,您可能应该重新考虑原因,但与此同时,请随意解除阻止。

关于c - C中的多线程程序中哪些信号不应该被线程阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26957816/

相关文章:

c - 在收到 SIGINT 或 SIGTERM(C 中的 Posix 线程)后关闭服务器之前等待线程终止

ios - 如何在特定线程完成工作后执行一些代码?

python - QThreadPool 按顺序运行而不是并行运行,是什么导致我的代码线程不并行运行?

c - 为什么c中的这个链表代码会出现故障?

c++ - unsigned char * 数据作为 c++ 或 c 中函数的返回类型

c# - 计算机视觉 : Segmentation of XRay image vertebrae detection

c - 在 GTK 中使用多线程?

带有线程的 C++ 主程序需要两次 Ctrl+C 才能退出

c - 如何捕获Control+D信号?

go - 是否可以只记录收到的每个信号而不改变行为?