【问题标题】:Interrupting epoll_wait with a non-IO event, no signals用非 IO 事件中断 epoll_wait,没有信号
【发布时间】:2011-01-15 17:06:24
【问题描述】:

当前场景是 epoll_wait 在几个 fds 和一个可能的传入消息队列上,我希望 epoll_wait 下面的循环在 IO 事件或新消息上执行。
我知道的方式:

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

上面发布的任何一点都不足以让我满意,我想知道是否还有其他我没有找到的方法。
原因是:

  • 信号在多线程代码中是要避免的,而且不是很可靠
  • 超时一删除了 epoll 的部分好处,只在事件中唤醒
  • self-pipe 技巧看起来是目前最好的方法,但仍然有太多样板

想法?

【问题讨论】:

    标签: linux networking asynchronous io


    【解决方案1】:

    您已经列举了可以唤醒 epoll 的事件,所以问题真的变成了:“如何减少 self-pipe 技巧的样板?”

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

    有一些库可以做到这一点,例如 C++ 的 boost.asio。但是,如果您只是针对 epoll,编写自己的代码并不难,并且一旦您拥有一个类/模块/处理 epoll 循环的任何东西,实际样板代码的数量应该是最少的。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 当只有一个线程在等待一个epollfd时我已经成功使用了eventfd,但是多个线程在等待一个same epollfd呢? eventfd 在这种情况下也有用吗?如果有,怎么做?
      猜你喜欢
      • 1970-01-01
      • 2017-08-29
      • 2013-07-10
      • 2011-02-27
      • 2015-12-14
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多