计时器(使用boost chrono steady_clock)在Ubuntu 64位上向前设置计算机时间后到期

时间:2015-08-21 08:31:00

标签: linux boost 64-bit chrono

我们正在使用boost:chrono来实现Timer。以下是我们的实施:

boost::chrono::time_point<boost::chrono::steady_clock> untilTime(boost::chrono::steady_clock::now() + boost::chrono::milliseconds(dueTime));

boost::condition_variable  m_condition;
(void)m_condition.wait_until(guard, untilTime);

在Ubuntu Linux 64位(经过12.04和15.04测试)上的计算机时间被设置为比定时器间隔更大的时间,定时器立即到期。

我们用不同的升级版本1.51,1.54,1.55,1.57,1.59

重现了这个问题

在Ubuntu Linux 32位(版本12.04,13.04)和Windows 7(32位和64位)问题无法再现。

1 个答案:

答案 0 :(得分:1)

http://en.cppreference.com/w/cpp/chrono/steady_clock

不是规范。

N4527是一个规范,虽然不是官方规范。这是C ++规范的最新工作草案。它在20.12.7.2/p1中说:

  

steady_clock的对象表示其值的时钟   time_point永远不会随着物理时间的推移而减少   值time_point以相对于实时的稳定速率前进。   也就是说,时钟可能无法调整。

我注意到你的使用:

(void)m_condition.wait_until(guard, untilTime);

忽略wait_until的返回值。请注意,此函数可能会返回虚假。也就是说,即使未发出信号,它也可能返回,即使超时未到期。

您可以发现超时是否已过期:

if (m_condition.wait_until(guard, untilTime) == std::cv_status::timeout)
    ...

可能(并且我猜)你的操作系统认为系统时间的调整是一个足够激烈的事件,谨慎地虚假地发出所有条件变量的信号。