让我们下面的一段代码,简单地衡量std::this_thread::sleep_for
调用20ms的持续时间: 的std :: this_thread :: sleep_for睡觉短于预期VS2015
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
int main()
{
for (int i = 0; i < 20; i++)
{
auto start = steady_clock::now();
this_thread::sleep_for(milliseconds(20));
auto end = steady_clock::now();
duration<double, milli> elapsed = end - start;
cout << "Waited " << elapsed.count() << " ms\n";
}
}
运行时与工具套件编译V120 (VS2013的),我得到的结果不如预期,即:
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
但与VS2015的工具集V140运行,结果多少有些令人吃惊和不尊重来自msdn和cppreference.com承诺说明(即sleep_for
阻止执行当前线程至少指定的sleep_duration
)。它们如下:
Waited 19.7793 ms
Waited 19.9415 ms
Waited 19.6056 ms
Waited 19.9687 ms
Waited 19.608 ms
Waited 19.589 ms
Waited 20.5435 ms
Waited 19.5669 ms
Waited 19.6802 ms
Waited 19.5381 ms
怎样的可能,以及如何可以让VS2015的sleep_for
只要预期至少睡觉?
的问候,的Dawid
编辑:
按照要求那些是我的设置和操作系统的详细信息:
OS:
Windows 7专业版64位
视觉工作室:2010旗舰版,2013社区,2015年专业与更新1个
编译器设置:
为Win32控制台应用程序的默认设置,
任何调试和发布配置,
任何x86和x64目标平台archit ectures
在早期唤醒的情况下,我通常在循环中使用'sleep_until()'。我认为早期唤醒不应该发生,但在GCC Linux上,至少,每当进程收到信号时(显然这里不是你的问题),提早醒来似乎就会发生。 – Galik
我在本地看不到相同的结果或例如在http://rextester.com/l/cpp_online_compiler_visual(它也使用VS2015)。考虑添加更多有关您的确切编译器设置,目标架构,主机操作系统,机器规格等的信息。 – Yirkha
@Yirkha:我在描述中添加了有关我的条件的更多详细信息。至于你的结果 - 它看起来像在我的系统中寻找一点点差异。 – dawid