Таймер, поддерживающий перекрывающийся ввод-вывод (для IOCP)?

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

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

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

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

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

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

Седрик


person Cédrics    schedule 13.07.2010    source источник


Ответы (2)


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

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

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

person Len Holgate    schedule 13.07.2010

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

person vijairaj    schedule 19.08.2013