read() returns 在 epoll 报告 timerfd 的 EPOLLIN 后 EAGAIN
read() returns EAGAIN after epoll reported EPOLLIN for timerfd
我使用带有 TFD_NONBLOCK
选项的 timerfd。
这个计时器被添加到只有 EPOLLIN
事件集的 epoll 控制器。
如果出现 EPOLLIN
,则在此计时器上使用 read()
。
在 99% 的情况下一切正常。执行在 epoll_wait
停止,然后在定时器间隔后继续。然而,在繁重的系统负载下,我收到了几次来自 read()
的 EAGAIN
。
我似乎收到了 EPOLLIN
,但没有任何内容可供阅读。
我可能找到了答案。
在我的程序中,我同时使用了几个计时器,其中一些正在修改其他计时器的间隔。在负载很少或没有负载的情况下,epoll 一次执行单个事件。在重负载下,一些事件被排队,然后循环执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔 - 它变为 'not-ready'。但随后循环进入第二个计时器,导致 not-ready-anymore 计时器上的 read()。
我使用带有 TFD_NONBLOCK
选项的 timerfd。
这个计时器被添加到只有 EPOLLIN
事件集的 epoll 控制器。
如果出现 EPOLLIN
,则在此计时器上使用 read()
。
在 99% 的情况下一切正常。执行在 epoll_wait
停止,然后在定时器间隔后继续。然而,在繁重的系统负载下,我收到了几次来自 read()
的 EAGAIN
。
我似乎收到了 EPOLLIN
,但没有任何内容可供阅读。
我可能找到了答案。
在我的程序中,我同时使用了几个计时器,其中一些正在修改其他计时器的间隔。在负载很少或没有负载的情况下,epoll 一次执行单个事件。在重负载下,一些事件被排队,然后循环执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔 - 它变为 'not-ready'。但随后循环进入第二个计时器,导致 not-ready-anymore 计时器上的 read()。