std chrono 时间同步

Posted

技术标签:

【中文标题】std chrono 时间同步【英文标题】:std chrono time synchronization 【发布时间】:2017-12-05 16:29:45 【问题描述】:

我需要通过网络发送一些带有时间戳的数据,这个时间应该有很高的精度。查看std::chrono 时钟,我发现std::chrono::*_clock::now() 返回time_point,这取决于时钟的时代。我没能找出每个时钟使用哪个纪元,以及在通过网络发送时可以安全使用哪个纪元。例如,在 Windows 上 high_resolution_clock 是 QueryPerformanceCounter 的包装器,它具有很好的精度,但我认为它作为网络任务的时间戳无用。

那么问题是如何通过网络“同步”高分辨率时钟?

【问题讨论】:

您能否将您对“高精度” 的定义添加到您的帖子中,因为它是一个高度主观的术语。您还可以澄清一下您是如何通过网络在通信计算机之间同步时间的,因为使用本地计算机时钟可能不够准确。 【参考方案1】:

std::chrono::system_clock 的纪元目前未指定。然而,它是自 1970-01-01 00:00:00 UTC 以来的便携式时间度量,忽略闰秒。这与所谓的Unix Time 一致。

我目前正在向standardize this existing practice 工作。 std::chrono::system_clock 的实现者私下向我保证,他们不会在此期间改变现有的做法。

另外两个 std 定义的计时时钟:high_resolution_clocksteady_clock,没有可移植定义的纪元。

注意system_clock,虽然它有一个(事实上的)可移植时代,但没有可移植精度。在 clang/libc++ 上,精度为微秒。在 gcc 上,精度为纳秒,在 Windows 上,精度为 100ns。所以你可以time_point_cast<microseconds>(system_clock::now()) 来获得便携精度。

【讨论】:

【参考方案2】:

如果您想要“高精度”(您应该指定更好的)同步,您首先需要使您的所有网络设备定期与同一个 NTP 服务器同步。您需要配置机器以便每隔几分钟(或几秒钟)调整一次时钟,因为在更新后(由于一些网络延迟会使它们在毫秒时不精确),时钟将再次开始漂移。

【讨论】:

以上是关于std chrono 时间同步的主要内容,如果未能解决你的问题,请参考以下文章

C++ std::chrono::seconds()函数(持续时间(秒))

c ++ chrono给出负纪元时间

std::chrono 和 cout

std::chrono::duration_cast - 比纳秒更精确的单位?

使用 std::chrono 在 C++ 中输出日期和时间

使用 std::chrono 在 C++ 中输出日期和时间