Реализация таймера с помощью выбора - PullRequest
0 голосов
/ 17 августа 2010

Я планирую написать небольшую библиотеку таймеров на C, используя timerfd_create.

Основной пользователь этой библиотеки будет иметь два потока

  • Поток приложений
  • Таймер резьбы

Между этими двумя потоками будет очередь, поэтому, когда приложение хочет запустить таймер, оно помещает в очередь сообщение, которое поток таймера затем читает, создает для него FD и помещает его в * 1012. *.

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

Одним из способов решения этой проблемы является включение таймаута выбора в каждый «тик», а затем проверка сообщений в очереди. Это лучший способ сделать это? Я также думал о создании прерывания каждый раз, когда приложение помещает сообщение в очередь select, чтобы прервать select. Это хорошо работает с многопоточными приложениями?

Платформа: Unix

Ответы [ 3 ]

2 голосов
/ 19 августа 2010

Если вы настаиваете на том, чтобы несколько потоков публиковали таймеры в выделенном потоке таймеров, сидящем в select(2), то почему бы не использовать eventfd(2) или просто старый добрый трюк с самоотдачей , чтобы сигнализировать о наличии новых таймеров. Включите дескриптор файла событий в набор опросов, дождитесь их всех.

0 голосов
/ 18 августа 2010

Если вы используете timerfd, тогда нет необходимости в выделенном потоке таймера, просто напишите приложение вокруг цикла обработки событий, используя select, poll или epoll и т. Д.

0 голосов
/ 18 августа 2010

На какую платформу (ы) вы хотите нацелиться?Например, в Windows есть гораздо лучшие способы справиться с этим без использования select (), например PostThreadMessage () и WaitMessage ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...