繁体   English   中英

std::this_thread::sleep_for 时间分辨率

[英]std::this_thread::sleep_for time resolution

所以我正在帮我的伙伴编写一些代码,我们在 sleep_for 函数中遇到了一些奇怪的地方:

这有效,给出了大约 16.7 毫秒的“可接受”时间(可接受的是 +/- 2-4 毫秒,但无论如何):

int main()
{
    long double milliseconds=16.7*1000;

    auto start=std::chrono::high_resolution_clock::now();
    using namespace std::chrono_literals;
    std::this_thread::sleep_for(std::chrono::duration<long double, std::micro>(1670));
    auto end=std::chrono::high_resolution_clock::now();

    std::cout << "Slept for: "<<std::chrono::duration<float, std::milli>(end-start)<<std::endl;
}

然而,这只会给你至少 30 毫秒,在 30 毫秒以上按预期工作:

int main()
{
    long double milliseconds=16.7*1000.0;

    auto start=std::chrono::high_resolution_clock::now();
    using namespace std::chrono_literals;
    std::this_thread::sleep_for(std::chrono::duration<long double, std::micro>(milliseconds*1000.0));
    auto end=std::chrono::high_resolution_clock::now();

    std::cout<<"Slept for: "<<std::chrono::duration<float, std::milli>(end-start)<<std::endl;
}

有人对此有解释吗?

我试过各种演员和不同的时期,他们最终都差不多。 使用毫秒及以上的周期会导致最小 30ms,微秒及以下有预期的结果。

我怀疑有不同的代码路径执行不同的时钟分辨率和触底或类似的事情,但为什么变量乘以 1000 从“ms”到“us”不起作用? 我不明白。

显然这是一个 Windows API“怪癖”,调用 timeBeginPeriod 不仅会在处理计时的 Win32 API 调用上设置最小周期分辨率,还会在 stdlib 上设置。

自然地,这段代码在 Linux 上的时机几乎是完美的。

感谢退休忍者的回答!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM