考虑以下计划:
#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标准。
答案 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
,...