linux - epoll 为 timerfd 报告 EPOLLIN 后,read() 返回 EAGAIN

标签 linux timer epoll

我使用带有 TFD_NONBLOCK 选项的 timerfd。

这个计时器被添加到只有 EPOLLIN 事件集的 epoll Controller 。 如果 EPOLLIN 发生,则在此计时器上使用 read()

在 99% 的情况下一切正常。执行在 epoll_wait 停止,然后在定时器间隔后继续。然而,在繁重的系统负载下,我收到了几次来自 read()EAGAIN

这看起来像我收到了 EPOLLIN 但没有任何内容可供阅读。

最佳答案

可能找到了答案。

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

关于linux - epoll 为 timerfd 报告 EPOLLIN 后,read() 返回 EAGAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34624230/

相关文章:

linux - 如何使用 mogrify 裁剪图像

c# - 让计时器执行 bidder00_TextChanged 事件

linux - epoll_wait() 占用太多 CPU

linux - Matlab 在不同的 Linux 桌面上运行速度变慢

linux - bash 脚本每天运行但不是每个月的第一天

c# - 如何在计时器函数中停止计时器?

java - onStop() 方法中的空指针异常

c - 如何检测 TCP 保活数据包并保持连接打开

c - Postgresql 和 libpq 。查询从随机数量的子进程中删除

java - JVM_Read持续消耗CPU