引用程序源部分下http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html处提供的代码。

对该代码的更改是:1)阻止SIGVTALRM而不是SIGQUITSIGUSR1,2)在注释部分(setitimer(2))后使用/* Main thread carries on to create other threads and/or do other work */设置计时器。

如果我们使用SIGVTALRM(如示例代码中的情况)或SIGINT,则SIGALRM以外的信号似乎已得到正确处理(例如pause(2),甚至是sigwait(3))。仅当主线程使用SIGVTALRM忙等待时才正确处理while(1);(在示例代码中替换pause();)。

看来ITIMER_VIRTUAL并没有减少(请注意,这只是我的怀疑)。为什么会这样呢?有没有办法在仍使用计时器的情况下解决此问题?

最佳答案

如果将SIGVTALRMkill一起发送,它应该可以正常到达。问题不在于信号传递,而是您误解了“虚拟时间”的含义。当线程正在休眠/阻塞等待某事时,任何事情都不会通过,因此计时器永远不会过期。也许您想要真实而非虚拟的时间。

09-11 18:12