9

可以在以下位置阅读:

https://svn.boost.org/trac/boost/ticket/3504

如果系统时间被修改(例如,使用date命令,如果您的操作系统是Linux)。

现在有没有一种简单而合适的方式来执行这个操作,使用 Boost?我不想使用 deadline_timer::expires_from_now() 因为我可以验证它不如“手动”更新到期时间准确。

作为一种临时解决方案,我决定在设置新的 expires_at 值之前,计算 now() 和 expires_at() 之间的时间段。如果它是周期性延迟的两倍以上,那么我会异常使用 expires_from_now() 与新的绝对时间重新同步。

4

1 回答 1

9

在 Boost 1.49+ 中,Boost.Asio提供steady_timer. 此计时器使用chrono::steady_clock不受系统时钟更改影响的单调时钟。

如果您不能使用 Boost 1.49+,那么检查计时器或时钟的变化是一个合理的替代解决方案。虽然它是一个实现细节,但 Boost.Asio 可能会限制在其反应器中等待事件所花费的时间,以便它可以定期检测系统时间的变化。例如,使用的反应器实现epoll将等待最多 5 分钟。因此,在不对反应器强制中断的情况下(例如在计时器上设置新的过期时间),Boost.Asio 最多可能需要 5 分钟才能检测到系统时间的更改。

于 2013-02-13T07:10:18.577 回答