使用非IO事件中断epoll_wait,无信号

Ark*_*nez 9 linux io networking asynchronous

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

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

上面发布的所有观点都不足以满足我的要求,我想知道是否还有其他方法我没有找到.
原因是:

  • 信号是多线程代码要避免的,并且不是很可靠
  • 超时一个消除了epoll的部分好处,只有事件醒来
  • 自管技巧目前看来是最好的方法,但仍然是太多的样板

想法?

Log*_*ldo 19

您可以使用eventfd,它实际上与自管道技巧相同,除了文件描述符更少且样板文件更少(例如,glibc具有便利eventfd_read/write功能).