gpt4 book ai didi

c++ - std::this_thread::sleep_for sleep 时间比 VS2015 中的预期短

转载 作者:可可西里 更新时间:2023-11-01 16:37:26 31 4
gpt4 key购买 nike

让我们有以下一段代码,它简单地测量以 20 毫秒调用的 std::this_thread::sleep_for 的持续时间:

#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 的 promise 和 cppreference.com sleep_for 描述(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 至少按预期休眠?

问候,大卫

编辑:

根据要求,这些是我的设置和操作系统详细信息:
操作系统:

  • Windows 7 专业版 64 位

  • Visual Studios:2010 Ultimate、2013 Community、2015 Professional with Update 1

编译器设置:

  • Win32 控制台应用程序的默认设置,

  • 任何调试和发布配置,

  • 任何 x86 和 x64 目标平台架构

最佳答案

VS2015 中的sleep_for() 方法实现已经包含围绕Sleep() 的循环系统调用,因此任何虚假唤醒都不会影响它 - 请参阅 VC\crt\src\STL\cthread.c 中的 _Thrd_sleep()


问题的原因很可能是 sleep_for() 和它在内部调用的 sleep_until() 正在使用 chrono::system_clock 来计算等待时间,但您正在使用 chrono::steady_clock 测量周期。

两个计时器可能具有相同的精度,但不一定具有相同的准确度。然后可能会发生 system_clock 滞后一点,而 steady_clock 已经提前了几微秒,并且使用 system_clock 计算的等待是实际上比要求的要短。


在这种情况下,steady_clock 是使用 QueryPerformanceCounter() 实现的(请参阅 VC\include\chrono,搜索 struct steady_clock),因此它将非常准确和精确,因为这是用于精确时间测量的首选 Windows API。

system_clock 是使用 GetSystemTimePreciseAsFileTime() 实现的(参见 VC\include\chrono,搜索 struct system_clock),它还 promise “最高可能的精度级别 (<1us)” . las,正如 MSDN 页面所说,此 API 仅在 Windows 8 及以上版本中受支持,您只能使用较旧的 GetSystemTimeAsFileTime()。在您的 Windows 7 机器上只有 ms 精度。这很可能是您测量错误的结果。


根据您的具体用例,您当然可以用不同的方式处理这个问题。我会考虑忽略这个小错误,因为挂起线程并等待调度程序唤醒它无论如何都不是很准确。

关于c++ - std::this_thread::sleep_for sleep 时间比 VS2015 中的预期短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35741656/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com