我怎么能打断一个无限的等待呢?

How can I interrupt an infinite sigtimedwait?

本文关键字:无限 一个 等待 怎么能      更新时间:2023-10-16

我的程序有一个由epoll(用于I/O)和条件变量(用于其他消息活动)约束的事件循环,以及负责捕获信号的工作线程(SIGINT, SIGTERM, SIGHUP)。SIGINTSIGTERMSIGHUPSIGPIPE在其他线程中被阻塞

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

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

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

这是在CentOS 6和7上(尽管首选通用的POSIX解决方案—

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

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

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