我希望我的应用程序能够在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
这种差异来自哪里?是否有更好(更精确)的方法?
谢谢!
答案 0 :(得分:2)
引自cppreference(参见sleep_for):
由于调度或资源争用延迟,此函数可能会阻塞比sleep_duration更长的时间。
我认为这是最可能的解释。详细信息取决于您的环境,尤其是您的操作系统。
一般来说,我认为没有可移植的方法可以避免它(不可移植的选项包括增加线程优先级或降低优秀级别)。
另一个(尽管不太可能)时间差异的原因是外部时钟调整(例如,由ntp守护程序引起)。使用steady_clock是针对时钟调整的便携式保险。
答案 1 :(得分:1)
显然,sleep_for
根本不准确。此问题的工作解决方案是进入while循环,直到达到所需的持续时间。这使应用程序“休眠”的时间恰好为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;
}