使用GCC 4.8.5编译时,C ++ 11 std :: this_thread :: sleep_until()挂起

时间:2017-12-20 22:06:27

标签: c++ c++11 gcc4.8

考虑以下计划:

#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标准。

2 个答案:

答案 0 :(得分:5)

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

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

  

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

答案 1 :(得分:3)

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

[33.2.4 Timing specifications]

  

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

     
      
  • 如果Ca> Ct,等待功能应该尽快唤醒,(...),因为超时   已经满意了。 [注意:当针对稳定时钟测量时,此规范可能导致等待的总持续时间减少。 - 结束说明]    - 如果Ca < Ct,...
  •