7

考虑以下程序:

#include <chrono>
#include <thread>

int main() {
    std::this_thread::sleep_until(std::chrono::steady_clock::now() - std::chrono::seconds(10));

    return 0;
}

当使用 GCC 4.8.5 编译时,它会挂起。使用GCC 4.9及以上或clang3.4及以上编译时,立即返回,

为什么会挂?据我了解,GCC 4.8.5 完全支持 C++11 标准。

4

2 回答 2

6

这是一个已确认的错误,已在 gcc 4.9 中修复。

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58038

使用 sleep_until() 时,我得到一个带有持续时间的无符号长标量表示的错误。如果这个duratoiin 是过去的,那么sleep_for() 的参数长度会溢出。这会导致几乎无限的睡眠,而不是快速返回。

于 2017-12-20T22:26:21.857 回答
5

标准考虑了这种情况,根据它sleep_until应该继续。似乎它是 GCC 4.8.5 中的一个错误

[33.2.4 时序规范]

名称以 _until 结尾的成员函数采用指定时间点的参数。这些函数产生绝对超时。实现应使用时间点中指定的时钟来测量这些功能的时间。给定一个时钟时间点参数Ct,从超时返回的时钟时间点应该是Ct + Di + Dm在超时期间没有调整时钟的时候。如果在超时期间将时钟调整到时间 Ca,则行为应如下所示:

  • 如果 Ca > Ct,等待函数应该尽快唤醒,(...),因为超时已经满足。[ 注意:当针对稳定时钟测量时,此规范可能会导致等待的总持续时间减少。— 尾注] — 如果Ca < Ct, ...
于 2017-12-20T22:26:57.073 回答