我需要通过网络发送一些带时间戳的数据,这次应该具有高精度。看std::chrono
个时钟,我发现std::chrono::*_clock::now()
返回time_point
,这取决于时钟的时代。我没有找到每个时钟使用哪个时代,以及在通过网络发送时可以安全使用哪个时代。例如,在windows上,high_resolution_clock是QueryPerformanceCounter
的包装,它具有良好的精度,但我认为,它无用作网络任务的时间戳。
所以问题是如何通过网络“同步”高分辨率时钟?
答案 0 :(得分:3)
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())
获得便携精度。
答案 1 :(得分:1)
如果您想要“高精度”(您应该指定更好)同步,首先需要使所有网络设备定期与同一NTP服务器同步。您需要配置机器以便每隔几分钟(或几秒)调整时钟,因为更新后(有一些网络延迟会使它们在毫秒级内不精确),时钟将再次开始漂移。