我将timerfd与TFD_NONBLOCK
选项一起使用。
此计时器已添加到仅设置了EPOLLIN
事件的epoll控制器中。
如果发生EPOLLIN
,则此计时器将使用read()
。
在99%的情况下,一切都很好。执行在epoll_wait
停止,然后在定时器间隔后继续。但是,在系统负载较重的情况下,我几次从EAGAIN
收到read()
。
这看起来像是我收到了EPOLLIN
但是没有任何内容可供阅读。
答案 0 :(得分:2)
我可能找到答案。
在我的计划中,我一次使用了一些计时器,其中一些正在修改其他计时器的间隔。 epoll很少或没有负载,一次执行单个事件。在高负载下,一些事件排队,然后循环执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔 - 它变为'未准备好'。但是接着循环继续进入第二个定时器,导致read-on on not ready-anymore timer。