引用计划来源部分下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
根本没有减少(注意这只是我的怀疑)。为什么会这样?有没有办法在使用计时器时解决这个问题?
答案 0 :(得分:0)
如果您使用SIGVTALRM
发送kill
,则应该会很快到达。问题不在于信号传递,而在于你误解了“虚拟时间”的含义。当你的线程正在休眠/阻塞等待某事时没有通过,所以计时器永远不会过期。也许你想要真正的而不是虚拟的时间。