Таймер, который поддерживает перекрывающийся ввод-вывод (для IOCP)? - PullRequest
5 голосов
/ 13 июля 2010

Мне нужно добавить поддержку таймеров в приложении на основе портов завершения ввода / вывода (IOCP).Я хотел бы избежать использования определенного потока для управления таймерами.

В Linux вы можете создать таймер, который доставляет уведомления об истечении срока действия с помощью файлового дескриптора (см. Timerfd.h man), поэтому его удобно использоватьнапример, с epoll, если ваше приложение основано на epoll.

В Windows вы можете использовать «таймеры ожидания» с асинхронным вызовом процедуры (ACP) (см. http://msdn.microsoft.com/en-us/library/ms686898(v=VS.85).aspx)

Если вам интересно, kqueue (BSD, Mac OS) поддерживает таймерыпо умолчанию (см. EVFILT_TIMER).

С портами завершения ввода / вывода мы должны использовать объекты, которые поддерживают перекрывающийся ввод / вывод. Итак, есть ли такой таймер для IOCP?

С наилучшими пожеланиями,

Cédrics

Ответы [ 2 ]

5 голосов
/ 13 июля 2010

Насколько я знаю, нет таймеров, которые генерируют завершение IOCP, когда они истекают.

Вы можете попробовать очередь таймера Windows; CreateTimerQueueTimer .

Я закончил писать свою собственную очередь таймера, которая использует дополнительный поток для запуска таймеров, так что это, вероятно, не годится для вас: см. здесь для серии статей, где я реализую очередь с TDD и полные юнит-тесты. Я нахожусь в процессе реализации высокопроизводительного TimerWheel с тем же интерфейсом, но опять же, который будет использовать внешний поток для управления таймерами.

0 голосов
/ 19 августа 2013

Вы можете использовать ожидаемые таймеры и поставить в очередь пользовательский пакет на порт завершения, используя «PostQueuedCompletionStatus». Но помните, что при наличии нескольких рабочих потоков будет уведомлен только один поток.

...