使用 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;
}
我希望我的应用程序正好休眠 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;
}