用非IO事件中断epoll_wait,没有信号

当前的情况是epoll_wait在几个fds和一个可能的传入消息队列,我想epoll_wait下面的循环执行IO事件或新消息。
我知道的方法:

  • 使用time毫秒超时,并在循环中检查队列的第一件事
  • 消息可用时,使用队列代码中的自我pipe道技巧
  • 用标准信号中断系统调用
  • 使用epoll_pwait并细化前一点

上面提到的要点都不足以满足我的要求,我想知道是否还有其他的方法,我没有find。
原因是:

  • 信号是multithreading代码要避免的,并不是很可靠
  • 超时可以消除epoll的一部分好处,只能用事件唤醒
  • 自我pipe理技巧目前看起来是最好的方法,但仍然过多的样板

想法?

除了使用更少的文件描述符和更少的样板文件(例如,glibc具有便利的eventfd_read/write函数)之外,您可以使用与自我管道技巧实际上相同的事件。

你已经列举了可以唤醒epoll的事件,所以这个问题真的变成了:“我如何减少自我管道技巧的样板?

这个问题的答案真的取决于你的代码,语言和你正在做的事情。 我假设你有一个处理I / O的线程,并且当没有I / O准备好的时候,你想在那个线程中做其他工作。 在管理epoll循环的代码中,它可以有一个内部句柄作为“唤醒”函数或“提交工作”函数暴露给系统的其他部分。

有这样的库,例如C ++的boost.asio。 但是,如果您只是针对epoll,编写自己的代码并不困难,并且一旦您拥有了一个类/模块/任何与epoll循环相关的代码,实际的样板代码的数量应该是最小的。