Я использую таймер в своем коде C ++ через функцию setitimer из sys / time.h.Это отображает сигнал SIGALRM на мой метод обработчика таймера.После этого я не могу использовать функцию сна.Я предполагаю, что это потому, что сон также использует сигнал SIGALRM.Можете ли вы предложить какой-либо обходной путь для этой проблемы?
Спасибо за ответ.
Со страницы руководства alarm(2) :
alarm(2)
sleep() может быть реализовано с использованием SIGALRM;смешивать вызовы к alarm() и sleep() - плохая идея.
sleep()
SIGALRM
alarm()
В некоторых реализациях не используется SIGALRM, найдите такую машину, и все готово.В противном случае вы можете попробовать nanosleep();это реализовано безопасно.На справочной странице nanosleep(2) :
nanosleep()
nanosleep(2)
По сравнению с sleep(3) и usleep(3) преимущество в том, что nanosleep() не влияет на сигналы, оно стандартизировано POSIX, он обеспечивает более высокое временное разрешение и позволяет легче продолжать сон, который был прерван сигналом.
sleep(3)
usleep(3)
Вы можете попробовать использовать select () в качестве таймера.Я не знаю, использует ли он SIGALRM или нет, но это должно быть просто проверить.Что-то вроде:
timeval t = {1, 0}; select(0, NULL, NULL, NULL, &t);
Я бы использовал библиотеку, которая дает абстракцию для этих служб ОС. Я использую библиотеку ACE для таймеров и снов (ACE_OS::sleep, ACE_Reactor::schedule_timeout), и они работают без проблем. Насколько я знаю, ACE использует select для своих таймеров. Я думаю, boost :: thread :: sleep и boost :: asio :: deadline_timer также успешно выполнят задачу.
ACE_OS::sleep
ACE_Reactor::schedule_timeout
select