使用 chrono 的精确时间睡眠

Precision time sleep using chrono

我希望我的应用程序正好休眠 2000 微秒:

#include <iostream>
#include <chrono>
#include <thread>

std::cout << "Hello waiter" << std::endl;
std::chrono::microseconds dura( 2000 );

auto start = std::chrono::system_clock::now();
std::this_thread::sleep_for( dura );
auto end = std::chrono::system_clock::now();

auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
std::cout << "Waited for " << elapsed.count() << " microseconds" << std::endl;

这导致

Waited for 2620 microseconds

这种差异从何而来?有更好(更精确)的方法吗?

谢谢!

引用自 cppreference(参见 sleep_for):

This function may block for longer than sleep_duration due to scheduling or resource contention delays.

我认为这是最有可能的解释。详细信息将取决于您的环境,尤其是您的 OS.

一般来说,我看不到避免它的可移植方法(不可移植的选项包括增加线程优先级或降低 nice 级别)。

导致时间差异的另一个(但不太可能)原因是外部时钟调整(例如,由 ntp 守护程序引起)。使用 steady_clock 是防止时钟调整的便携式保险。

显然,sleep_for一点也不准确。此问题的有效解决方案是进入一个 while 循环,直到达到所需的持续时间。这使得应用程序 "sleep" 正好 2000 微秒。

bool sleep = true;
while(sleep)
{
    auto now = std::chrono::system_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(now - start);
    if ( elapsed.count() > 2000 )
        sleep = false;
}