Использование Sleep () при использовании таймеров через setitimer
Я использую таймер в своем коде C++ через функцию setitimer из sys / time.ч. Это карты по истечении отправляет сигнал мой метод-обработчик таймера. После этого я не могу использовать функцию сна. Я предполагаю, что это потому, что сон также использует сигнал SIGALRM. Можете ли вы предложить какой-либо обходной путь для этой проблемы?
Спасибо за ответ.
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 также успешно выполнят эту задачу.
Comments