我们正在使用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位)问题无法再现。
答案 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)
...
可能(并且我猜)你的操作系统认为系统时间的调整是一个足够激烈的事件,谨慎地虚假地发出所有条件变量的信号。