Использование Sleep () при использовании таймеров через setitimer - PullRequest
3 голосов
/ 05 сентября 2010

Я использую таймер в своем коде C ++ через функцию setitimer из sys / time.h.Это отображает сигнал SIGALRM на мой метод обработчика таймера.После этого я не могу использовать функцию сна.Я предполагаю, что это потому, что сон также использует сигнал SIGALRM.Можете ли вы предложить какой-либо обходной путь для этой проблемы?

Спасибо за ответ.

Ответы [ 3 ]

8 голосов
/ 05 сентября 2010

Со страницы руководства alarm(2) :

sleep() может быть реализовано с использованием SIGALRM;смешивать вызовы к alarm() и sleep() - плохая идея.

В некоторых реализациях не используется SIGALRM, найдите такую ​​машину, и все готово.В противном случае вы можете попробовать nanosleep();это реализовано безопасно.На справочной странице nanosleep(2) :

По сравнению с sleep(3) и usleep(3) преимущество в том, что nanosleep() не влияет на сигналы, оно стандартизировано POSIX, он обеспечивает более высокое временное разрешение и позволяет легче продолжать сон, который был прерван сигналом.

3 голосов
/ 05 сентября 2010

Вы можете попробовать использовать select () в качестве таймера.Я не знаю, использует ли он SIGALRM или нет, но это должно быть просто проверить.Что-то вроде:

   timeval t = {1, 0};

   select(0, NULL, NULL, NULL, &t);
0 голосов
/ 05 сентября 2010

Я бы использовал библиотеку, которая дает абстракцию для этих служб ОС. Я использую библиотеку ACE для таймеров и снов (ACE_OS::sleep, ACE_Reactor::schedule_timeout), и они работают без проблем. Насколько я знаю, ACE использует select для своих таймеров. Я думаю, boost :: thread :: sleep и boost :: asio :: deadline_timer также успешно выполнят задачу.

...