代码之家  ›  专栏  ›  技术社区  ›  peku33

read()在epoll报告timerfd的EPOLLIN后返回EAGAIN

  •  1
  • peku33  · 技术社区  · 9 年前

    我使用timerfd TFD_NONBLOCK 选项

    此计时器仅添加到epoll控制器 EPOLLIN 事件集。 如果 埃波林 发生, read() 用于此计时器。

    99%的情况下,一切都很好。执行停止于 epoll_wait ,然后在定时器间隔后继续。然而,在繁重的系统负载下,我收到了 EAGAIN 从…起 读取() 几次。

    看起来我收到了 埃波林 但是没有什么可以用来阅读的。

    1 回复  |  直到 9 年前
        1
  •  2
  •   peku33    9 年前

    可能 找到了答案。

    在我的程序中,我同时使用了几个计时器,其中一些计时器修改了其他计时器的间隔。在很少或没有负载的情况下,epoll同时执行单个事件。在重负载下,一些事件被排队,然后在循环中执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔,则它将变为“未就绪”。但随后循环进入第二个计时器,导致read()上的计时器不再就绪。