我的程序有一个事件循环,它受epoll(对于I / O)和条件变量(对于其他消息 Activity )约束,还有一个负责捕获信号的工作线程(SIGINTSIGTERMSIGHUP)。 SIGINTSIGTERMSIGHUPSIGPIPE在所有其他线程中被阻止。

我的epoll_wait调用有500毫秒的超时时间,但是我试图减少上下文切换并使用无限的epoll_wait,当主线程确定是时候退出程序并且事件循环应该停止时,通过管道 Activity 将其唤醒。

同样,我的sigtimedwait调用有500毫秒的超时(并在每次调用后检查std::atomic<bool>,以查看是否需要停止),我想用不需要一直醒来检查中断的东西来代替它。

我可以从主线程向信号监视线程发出信号以实现此目的吗?还是有更好的方法来捕捉当今时代的信号?

这是在CentOS 6和7上进行的(尽管首选一般的POSIX解决方案-仅用于标准C++ 11即可获得加分!)。

最佳答案

使用signal file descriptors而不是信号处理程序。

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

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

关于c++ - 如何中断无限的sigtimedwait?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40564227/

10-13 03:14