epoll_wait,select和poll函数都提供超时。然而对于epoll,它的分辨率为1ms。选择& ppoll是唯一提供亚毫秒超时的。
这意味着最好以1毫秒的间隔做其他事情。我可以在1ms内在现代CPU上做很多其他事情。
所以要经常做1ms以上的其他事情我实际上必须提供零超时(基本上禁用它)。而且我可能会在主循环中的某处添加自己的usleep来阻止它占用过多的CPU。
所以问题是,为什么当我认为存在更高分辨率超时的情况时,以毫秒为单位的超时。
答案 0 :(得分:11)
由于您使用的是Linux,因此您可以简单地使用timerfd API,而不是提供零超时值并在循环体中手动操作。这实际上允许您创建与文件描述符关联的计时器(分辨率小于1毫秒),您可以将其添加到受监控描述符集。
答案 1 :(得分:2)
epoll_wait
接口刚刚从poll
继承了以毫秒为单位的超时。虽然poll
的时间不到一毫秒是没有意义的,但由于将调用线程添加到所有等待集的开销,它对epoll_wait
有意义。对epoll_wait
的调用不需要将调用线程放在多个等待集上,调用开销非常低,并且在非常罕见的情况下,它可能有意义阻塞不到一毫秒。
我建议只使用一个计时线程。您想要做的大多数事情都可以在该时间线程中完成,因此您不需要突破epoll_wait
。如果确实需要从epoll_wait
返回一个线程,只需将一个字节发送到线程轮询的管道,等待就会终止。