可以阅读:
https://svn.boost.org/trac/boost/ticket/3504
一个deadline_timer定期超时并且使用deadline_timer :: expires_at()实现(如Boost Timer Tutorial, 3th example中的示例)如果系统时间被修改可能会失败(例如,使用date命令,如果你的操作系统是Linux)。
使用Boost,现在是否有一种简单而合适的方式来执行此操作?我不想使用deadline_timer :: expires_from_now(),因为我可以验证它不如“手动”更新到期时间那么准确。
作为一个时间解决方案,我决定在设置新的expires_at值之前,计算now()和expires_at()之间的时间段。如果它超过周期性延迟的两倍,那么我特别使用expires_from_now()来重新同步新的绝对时间。
答案 0 :(得分:9)
在Boost 1.49 +中,Boost.Asio提供steady_timer
。此计时器使用chrono::steady_clock
,这是一个不受系统时钟变化影响的单调时钟。
如果你不能使用Boost 1.49+,那么检查定时器或时钟的变化是一个合理的替代解决方案。虽然它是一个实现细节,但Boost.Asio可能会限制等待其反应堆中事件所花费的时间,以便它可以定期检测系统时间的变化。例如,使用epoll
的反应器实现将等待最多5分钟。因此,在不强制反应器中断的情况下(例如在计时器上设置新的过期时间),可以在检测到系统时间变化之前将Boost.Asio最多占用5分钟。