【发布时间】:2013-11-12 16:17:52
【问题描述】:
我用std::this_thread::sleep_for(std::chrono::seconds(1)); 睡了一秒钟。我发现如果我在睡眠期间向后调整系统时间,睡眠时间会延长我刚刚调整的时间。
但是std::this_thread::sleep_for() 应该不受系统时间影响而工作,而std::this_thread::sleep_until() 可能应该表现出上述行为。
当我查看 Visual C++ 2012 的 std::this_thread::sleep_for() 实现时,我发现
template<class _Rep,
class _Period> inline
void sleep_for(const chrono::duration<_Rep, _Period>& _Rel_time)
{ // sleep for duration
stdext::threads::xtime _Tgt = _To_xtime(_Rel_time);
sleep_until(&_Tgt);
}
所以sleep_for()是在Visual C++ 2012中使用sleep_until()实现的。我搜索了C++11标准,并没有真正禁止这种实现。那么如何才能在不受系统时钟调整影响的固定时间段内入睡呢?
【问题讨论】:
-
它确实独立于系统时钟调整工作。系统对睡眠后挂钟时间的最佳猜测比系统对睡眠前挂钟时间的最佳猜测多一秒。想象一下,如果时钟很慢,而你睡了一天,你会希望时钟调整来纠正睡眠时间——忽略它们是不正确的。
-
使用
sleep_until和 stable_clock? -
steady_clockof VC2012 不稳定:connect.microsoft.com/VisualStudio/feedback/details/753063 -
30.2.4 时序规范 [thread.req.timing] 的意图是完全出于您陈述的原因取缔此实现。如果没有这些要求,
_for和_until函数之间的预期功能差异将大大减少。 -
@HowardHinnant 不敢相信我错过了!你说的对。所以问题是VC++ 2012对
sleep_for的实现不符合标准。考虑到steady_clock问题,那些假定的不同时钟只是作为彼此的typedefs 实现的。chrono部分好像被赶出来了。
标签: c++ visual-c++ c++11 time thread-sleep