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_clock
和 steady_clock
,没有可移植定义的纪元。
注意system_clock
,虽然它有一个(事实上的)可移植时代,但没有可移植精度。在 clang/libc++ 上,精度为微秒。在 gcc 上,精度为纳秒,在 Windows 上,精度为 100ns。所以你可以time_point_cast<microseconds>(system_clock::now())
来获得便携精度。
【讨论】:
【参考方案2】:如果您想要“高精度”(您应该指定更好的)同步,您首先需要使您的所有网络设备定期与同一个 NTP 服务器同步。您需要配置机器以便每隔几分钟(或几秒钟)调整一次时钟,因为在更新后(由于一些网络延迟会使它们在毫秒时不精确),时钟将再次开始漂移。
【讨论】:
以上是关于std chrono 时间同步的主要内容,如果未能解决你的问题,请参考以下文章
C++ std::chrono::seconds()函数(持续时间(秒))