2010-07-13 8 views
5

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

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

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

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

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

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

Cedrics

ответ

5

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

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

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

0

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