aby*_*s.7 7 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);
Run Code Online (Sandbox Code Playgroud)
但我的理智建议保留一些信号畅通无阻,因为有很多情况可以将信号直接发送到特定线程:SIGSEGV或者SIGPROF- 我相信,它与SIGINT在交互式程序中保持畅通无阻一样好.
我的建议是否正确这两个信号(SIGSEGV,SIGPROF)?
根据一些常识,我应该保留哪些其他信号?
异步信号(其中大部分,包括kill命令/函数发送的任何信号以及控制终端生成的信号,例如SIGINT)可传递到进程中信号未阻塞的任何线程,因此无需在所有线程中保持它们未阻塞。如果您使用专用信号处理线程,则希望它们在除信号处理线程之外的所有线程中被阻塞。
另一方面,同步信号由于特定线程的操作而被传递到该线程。它们包括SIGPIPE、SIGBUS、SIGSEGV、SIGFPE等。除了 之外SIGPIPE,这些都不应该发生,除非您的程序中有严重的错误,并且您可能SIGPIPE无论如何都想阻止,这样您就可以得到EPIPE错误并正确处理这种情况。因此,在大多数情况下,我会说,将它们全部阻止并没有什么坏处。如果您确实发现自己需要处理SIGSEGV或类似的事情,您可能应该重新考虑原因,但同时请随意解除阻止。