std chrono时间同步

时间:2017-12-05 16:29:45

标签: c++ c++11 chrono

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

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

2 个答案:

答案 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_clocksteady_clock,没有可移植定义的时期。

请注意,system_clock虽然具有(事实上)便携式纪元,但没有便携精度。在clang / libc ++上,精度是微秒。在gcc上精度为纳秒,在Windows上精度为100ns。所以你可以time_point_cast<microseconds>(system_clock::now())获得便携精度。

答案 1 :(得分:1)

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