2016-01-06 4 views
1

Я использую timerfd с опцией TFD_NONBLOCK.read() возвращает EAGAIN после публикации epoll EPOLLIN для timerfd

Этот таймер добавлен в контроллер epoll только с набором событий EPOLLIN. При возникновении EPOLLIN на этом таймере используется read().

В 99% случаях все отлично работает. Выполнение останавливается на epoll_wait, затем продолжается после интервала таймера. Однако при тяжелой загрузке системы я получил EAGAIN от read() несколько раз.

Похоже, я получаю EPOLLIN, но тогда для чтения ничего не доступно.

ответ

2

I Возможно, нашел ответ.

В моей программе я использовал несколько таймеров сразу, некоторые из них изменяли интервалы других. С небольшим или без нагрузки epoll выполнял одно событие сразу. При большой нагрузке некоторые события были поставлены в очередь, а затем выполнялись в цикле. При обработке очереди, если первый случай изменил интервал следующего таймера - он стал «неготовым». Но затем цикл перешел к второму таймеру, вызвав read() на не готовом таймере.

+0

Через некоторое время я могу сказать - это БЫЛО решение :) – peku33