Использование Sleep () при использовании таймеров через setitimer



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

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

50   3  

3 ответов:

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

   timeval t = {1, 0};

   select(0, NULL, NULL, NULL, &t);

Из alarm(2) man page :

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

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

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

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

    Ничего не найдено.

Добавить ответ:
Отменить.