代码之家  ›  专栏  ›  技术社区  ›  Arkaitz Jimenez

以非IO事件中断epoll等待,无信号

  •  8
  • Arkaitz Jimenez  · 技术社区  · 16 年前

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

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

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

    • 在多线程代码中,信号是要避免的,而且不太可靠
    • 超时1删除了epoll的一部分好处,只使用事件唤醒
    • 自管戏法目前看来是最好的方法,但还是太陈词滥调了。

    思想?

    2 回复  |  直到 16 年前
        1
  •  18
  •   Logan Capaldo    16 年前

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

        2
  •  1
  •   janm    16 年前

    您已经列举了可以唤醒epoll的事件,因此问题实际上变成了:“如何减少self pipe技巧的样板文件?”

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

    有这样的库,例如C++的BooSt.asIO。但是,如果您只是以epoll为目标,那么编写自己的代码并不困难,而且一旦您有了处理epoll循环的类/模块/任何东西,那么实际样板代码的数量应该是最小的。