C++ 使用chrono库获取系统时间不准确

C++ 使用chrono库获取系统时间不准确,c++,ubuntu,chrono,C++,Ubuntu,Chrono,我使用std::chrono以500毫秒的间隔对系统时间进行采样。在每个样本上,我从最后一次减去当前时间,然后累积结果。然而,1小时后,总累积时间比1小时快约50毫秒。有人知道原因吗?获取系统时间的代码如下: void serverTimeResponse(long serverTime) { long localTime =(long)std::chrono::duration_cast<std::chrono::microseconds(now.time_si

我使用std::chrono以500毫秒的间隔对系统时间进行采样。在每个样本上,我从最后一次减去当前时间,然后累积结果。然而,1小时后,总累积时间比1小时快约50毫秒。有人知道原因吗?获取系统时间的代码如下:

void serverTimeResponse(long serverTime) {        
     long localTime =(long)std::chrono::duration_cast<std::chrono::microseconds(now.time_since_epoch()).count();        
      long duration = localtime - serverTime;        
    writeToCsvFile(duration); 

} 

void serverTimeResponse(长serverTime){

long localTime=(long)std::chrono::duration_cast我可以理解您试图实现的目标,但您可能会遇到与操作系统线程调度相关的问题。您还没有生成一个最小的可复制示例,因此我假设您正在使用例如:

std::this_thread::sleep_for(500ms);
如果是这样的话,那么你就要受操作系统的摆布,才能睡上正确的时间

每500毫秒采样一次当前时间并减去最后一次,这听起来不错。但是,当你睡眠500毫秒时,操作系统会安排程序在该数字附近的某个时间被唤醒。记住,操作系统不是实时的。它们不能保证你的应用程序将睡眠500毫秒

所有这些样本之间的微小睡眠时间差异将相加。以下是一些计算:

You are sampling every 500ms for 1hr:

1000ms * 60s * 60m = 3600000ms  // 1hr in milliseconds
3600000ms / 500ms = 7200        // 7200 samples @ 500ms each
50ms / 7200 =  0.006944444ms    // or 6.944444us error per sample

正如你所看到的,有一个6.9us的小错误。所以操作系统几乎睡眠了500毫秒,但并没有完全睡眠。这些小错误加起来,在精确睡眠时,你不能做很多事情。

请展示一个,现在什么是
?你怎么知道它改变了50毫秒?你用什么来测量系统时间?或者你只是看看在日志中捕捉同步时钟的systemd计时器?@AlanBirtles我每500毫秒从服务器上获取一个标准时间。当这个时间到达本地时间时,我记录当前本地时间,然后减去这两个时间以获得差值。差值不断增大,每小时增加约50毫秒。我仍然需要@AlanBirtles更新了一些有问题的代码,请看一下,thanks@g-radan,最小可复制示例
void serverTimeResponse(long serverTime){long localTime=(long)std::chrono::duration_cast(now.time_-since_epoch()).count();long duration=localTime-serverTime;writeToCsvFile(duration);}
serverTimeResponse将每隔500毫秒调用一次,因为服务器将通过套接字返回,我将持续时间记录到csv文件中,1小时后,我看到csv文件中最后一行的持续时间比第一行的持续时间多50毫秒。我怀疑chrono库在获取系统时间方面是否有问题。@Eric这是你的问题,不要把它放在这里在一篇评论中(无论如何,这仍然不是一篇评论)@g-radan,更新这个问题,请帮忙看一下,thanks@Eric我不能运行这个代码来查看问题。创建一个新的C++应用程序,隔离确切的问题,显示完整的代码(main函数+额外代码突出问题)。如果需要,请使用在线编写并测试问题,然后单击右上的“共享”按钮,并在此处复制共享的锁销链接。