什么信号不应该被多线程阻塞
我有一个多线程程序。 我想在一个线程中处理所有有意义的信号。 这就是我在创建任何线程之前所做的:
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);
但是我的好意是建议让一些信号畅通无阻,因为当信号可以直接发送到特定的线程时有很多情况: SIGSEGV
或SIGPROF
- 我相信,这与在交互式程序中保留无阻碍的SIGINT
一样好。
我的建议对这两个信号( SIGSEGV
, SIGPROF
)是否正确?
我应该根据一些常识解开其他什么信号?
异步信号(其中大部分包括kill
命令/函数发送的任何信号以及控制终端(如SIGINT
)生成的SIGINT
)都可交付给进程中的任何信号畅通无阻的线程,因此无需将它们解除阻塞所有线程。 如果您使用的是专用信号处理线程,则希望它们在除信号处理线程外的所有线程中都被阻塞。
另一方面,由于该线程的动作,同步信号被传送到特定的线程。 它们包括SIGPIPE
, SIGBUS
, SIGSEGV
, SIGFPE
等。除了SIGPIPE
,除非程序中存在严重的错误,否则这些应用都不会发生,并且您可能想阻止SIGPIPE
,因此您可以获取EPIPE
错误并处理这个条件适当。 所以大多数情况下,我会说,阻止他们全部并没有什么坏处。 如果你真的发现自己需要处理SIGSEGV
等,你可能应该重新思考原因,但同时可以随意解锁它。
上一篇: What signals shouldn't be blocked by thread in multi
下一篇: Undefined behaviour when using iostream read and signed char