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

时间:2010-02-11 12:49:34

标签: linux networking asynchronous io

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

  • 使用time毫秒超时并在循环中检查队列中的第一件事
  • 当消息可用时,使用队列代码中的self-pipe trick
  • 使用标准信号中断系统调用
  • 使用epoll_pwait并优化前一点

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

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

想法?

2 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:1)

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

该问题的答案实际上取决于您的代码,语言以及您要做的事情。我假设您有一个处理I / O的线程,并且您希望在没有I / O就绪的情况下在该线程中执行其他工作。在管理epoll循环的代码中,它可以有一个内部句柄,作为“唤醒”函数或“提交工作”函数暴露给系统的其他部分。

有些库可以执行此操作,例如用于C ++的boost.asio。但是,如果您只是针对epoll,那么编写自己的内容并不困难,并且一旦您有类/模块/处理epoll循环的任何内容,实际样板代码的数量应该是最小的。