引用程序源部分下http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html处提供的代码。
对该代码的更改是:1)阻止SIGVTALRM
而不是SIGQUIT
和SIGUSR1
,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
并没有减少(请注意,这只是我的怀疑)。为什么会这样呢?有没有办法在仍使用计时器的情况下解决此问题?
最佳答案
如果将SIGVTALRM
与kill
一起发送,它应该可以正常到达。问题不在于信号传递,而是您误解了“虚拟时间”的含义。当线程正在休眠/阻塞等待某事时,任何事情都不会通过,因此计时器永远不会过期。也许您想要真实而非虚拟的时间。