Linux read()在epoll为timerfd报告EPOLLIN后返回EAGAIN
我使用带有Linux read()在epoll为timerfd报告EPOLLIN后返回EAGAIN,linux,timer,epoll,Linux,Timer,Epoll,我使用带有TFD\u NONBLOCK选项的timerfd 此计时器添加到epoll控制器时仅设置了EPOLLIN事件。 如果出现EPOLLIN,则此计时器上使用read() 在99%的情况下,一切都很好。在epoll\u wait上停止执行,然后在计时器间隔后继续执行。然而,在系统负载较重的情况下,我收到了来自read()的EAGAIN几次 这看起来像是我收到了EPOLLIN,但是没有任何东西可以阅读。i可能找到了答案 在我的程序中,我同时使用了几个计时器,其中一些计时器正在修改其他计时器的间
TFD\u NONBLOCK
选项的timerfd
此计时器添加到epoll控制器时仅设置了EPOLLIN
事件。
如果出现EPOLLIN
,则此计时器上使用read()
在99%的情况下,一切都很好。在epoll\u wait
上停止执行,然后在计时器间隔后继续执行。然而,在系统负载较重的情况下,我收到了来自read()
的EAGAIN
几次
这看起来像是我收到了EPOLLIN,但是没有任何东西可以阅读。i可能找到了答案
在我的程序中,我同时使用了几个计时器,其中一些计时器正在修改其他计时器的间隔。在负载很少或没有负载的情况下,epoll一次执行单个事件。在重载情况下,一些事件排队,然后在循环中执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔-它将变为“未就绪”。但随后循环转到第二个计时器,导致计时器上的read()不再就绪。过了一段时间,我可以说-这是一个解决方案:)