为什么sigwait()MT安全但sigsuspend()不是?

时间:2015-11-10 20:37:45

标签: c linux multithreading

我正在寻找一个多线程应用程序,其中一个线程在继续之前等待另一个线程发出信号。根据{{​​3}},由于竞争条件,sigsuspend不是MT安全的。根据{{​​3}},在这些情况下应使用sigwait。我想知道为什么。

根据手册页说明(herehere),看来......

sigsuspend (const sigset_t *mask)实际上更改了进程的信号掩码,这会影响所有线程。

sigwait (const sigset_t *set, int *sig)只需等待set 中的一个指示信号,而不用更改线程(或进程)的信号掩码。

这种理解是否正确?如果是这样,sigwait如何阻止而不更改信号掩码?

1 个答案:

答案 0 :(得分:4)

实际上sigwait会更改掩码,但会将其恢复,请参阅此内容(UNIX环境中的高级编程):Signals and Threads

还有:Oracle Multithreaded Programming Guide