Как можно прочитать на:
https://svn.boost.org/trac/boost/ticket/3504
deadline_timer, который периодически истекает и который реализуется с помощью deadline_timer :: expires_at () (как в примере в Учебник по Boost Timer, 3-й пример), вероятно, потерпит неудачу, если системное время будет изменено (например, с помощью команды date, если ваша операционная система Linux).
Есть ли простой и подходящий способ выполнить эту операцию сейчас, используя Boost? Я не хочу использовать deadline_timer :: expires_from_now (), потому что я мог убедиться, что это менее точно, чем «ручное» обновление времени истечения.
В качестве временного решения я решил до установки нового значения expires_at рассчитать период времени между now () и expires_at (). Если периодическая задержка больше чем в два раза, тогда я исключительно использую expires_from_now () для повторной синхронизации с новым абсолютным временем.
В Boost 1.49+, Boost.Asio обеспечивает steady_timer
. Этот таймер использует chrono::steady_clock
, это монотонные часы, на которые не влияют изменения системных часов.
Если вы не можете использовать Boost 1.49+, то проверка таймеров или часов на предмет изменений является разумным альтернативным решением. Хотя это является деталью реализации, Boost.Asio может ограничивать количество времени, затрачиваемое на ожидание события в его реакторе, чтобы оно могло периодически обнаруживать изменения в системном времени. Например, реализация реактора с использованием epoll
будет ждать максимум 5 минут. Таким образом, без принудительного прерывания на реакторе (например, установки нового времени истечения на таймере), может потребоваться Boost.Asio до 5 минут, прежде чем обнаружатся изменения в системном времени.
Других решений пока нет …