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

Lig*_*ica 3 c++ signals pthreads c++11

我的程序具有通过处分事件循环epoll(对于I/O)和条件变量(对于其它消息活性),以及一个工作线程负责捕获信号(SIGINT,SIGTERM,SIGHUP).SIGINT,SIGTERM,SIGHUPSIGPIPE被阻挡在所有其他线程.

我的epoll_wait调用有500ms的超时,但是我试图减少上下文切换并使用无限epoll_wait代替,当主线程决定退出程序并且应该停止事件循环时,通过管道活动唤醒.

同样地,我的sigtimedwait呼叫有500毫秒超时(并std::atomic<bool>在每次呼叫后检查一次,看是否需要停止),并且我想用不需要保持醒来检查中断的东西来替换它.

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

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

Sam*_*hik 5

使用信号文件描述符,而不是信号处理程序.

现在可以通过从可扩展的文件描述符中读取信号来接收信号,而不是信号处理程序,并且可以作为epoll集的一部分进行处理.

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