c++ - std::this_thread::sleep_for 时间分辨率

标签 c++ sleep c++-chrono

所以我正在帮助我的 friend 编写一些代码,我们在 sleep_for 函数中遇到了一些奇怪的问题:

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

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;
}

有人对此有解释吗?

我尝试过不同时期的不同选角,但结果都差不多。 使用毫秒周期及以上会导致最少 30 毫秒,微秒及以下会产生预期结果。

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

最佳答案

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

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

感谢退休忍者的回答!

关于c++ - std::this_thread::sleep_for 时间分辨率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74831459/

相关文章:

c++ - 如何在一个属性中动态存储基本类型?

ios - 在手机休眠时运行计时器

c++ - 保存和加载 std::chrono::time_point 到文件

c++ - 标准线程 sleep_for 不适用于某些 chrono::duration

c++ - move 的对象仍然被破坏?

c++ - 嵌入式 C/C++ : undefined reference of an existing symbol

java - 如何同时显示启动屏幕和我的 JFrame?

c++ - 在 C++ 中为 std::chrono 时钟设置/暂停时钟时间

c++ - 如何强制 clang 默认使用某些库?

bash - bash 脚本中的读取与 sleep