所以我正在帮助我的 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/