【问题标题】:How to sleep for a fixed period of time not affected by system clock adjustment in Visual C++ 2012如何在 Visual C++ 2012 中休眠一段不受系统时钟调整影响的固定时间
【发布时间】: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?
  • 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


【解决方案1】:

您可能应该使用timer queues 这些是精确的相对计时器。要使计时器可等待,请让您的计时器例程触发this example 中的事件。

【讨论】:

  • @WiSaGaN 所有的便携方式都有很大的问题。时间是不可移植的东西,如果没有一个额外的库来实现它,比如网络 I/O。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多