我怎样才能打断无限的sigtimedwait?

时间:2016-11-12 15:11:33

标签: c++ c++11 pthreads signals

我的程序有一个事件循环,由epoll(用于I / O)和条件变量(用于其他消息活动),以及负责捕获信号的工作线程(SIGINT,{{{ {1}},SIGTERM)。所有其他主题中都会屏蔽SIGHUPSIGINTSIGTERMSIGHUP

我的SIGPIPE调用有超时500毫秒,但我正在尝试减少上下文切换并使用无限epoll_wait代替,当主线程决定它的时间时,由管道活动唤醒退出程序,应该停止事件循环。

同样,我的epoll_wait通话有超时500毫秒(并在每次通话后检查sigtimedwait,看是否需要停止),我想用某些东西替换它不需要继续醒来检查中断。

我可以从主线程向信号监听线程发出信号来实现这个,或类似的东西吗?或者在这个时代有没有更好的方法来捕捉信号?

这是在CentOS 6和7上(虽然一般的POSIX解决方案是首选 - 仅仅是标准C ++ 11的奖励积分!)。

1 个答案:

答案 0 :(得分:5)

使用signal file descriptors代替信号处理程序。

信号的接收现在将通过读取文件描述符而不是信号处理程序来完成,该文件描述符是可上传的,并且可以作为epoll集的一部分进行处理。

是的,这是在Linux上,在这个时代捕获信号的更好方法。