目前的情况是epoll_wait超过几个fds和一个可能的传入消息队列,我想在epoll_wait下面的循环在IO事件或新消息上执行。
我知道的方式:
time
毫秒超时并在循环中检查队列中的第一件事上面发布的所有观点都不足以满足我的要求,我想知道是否还有其他方法我找不到。
原因是:
想法?
答案 0 :(得分:19)
您可以使用eventfd,这与自管道技巧实际上是相同的,除了文件描述符更少且样板文件更少(例如,glibc具有便利eventfd_read/write
函数)。
答案 1 :(得分:1)
你已经列举了可以唤醒epoll的事件,所以问题真的变成了:“如何减少自我管道技巧的样板?”
该问题的答案实际上取决于您的代码,语言以及您要做的事情。我假设您有一个处理I / O的线程,并且您希望在没有I / O就绪的情况下在该线程中执行其他工作。在管理epoll循环的代码中,它可以有一个内部句柄,作为“唤醒”函数或“提交工作”函数暴露给系统的其他部分。
有些库可以执行此操作,例如用于C ++的boost.asio。但是,如果您只是针对epoll,那么编写自己的内容并不困难,并且一旦您有类/模块/处理epoll循环的任何内容,实际样板代码的数量应该是最小的。