STD计时时间同步

std chrono time synchronization

本文关键字:同步 时间 STD      更新时间:2023-10-16

我需要通过时间戳通过网络发送一些数据,这次应该具有很高的精度。查看std::chrono时钟,我发现std::chrono::*_clock::now()返回time_point,这取决于时钟的时期。我未能发现每个时钟都使用了哪个时期,并且在发送WIA网络时可以安全使用哪个时期。例如,在Windows High_resolution_clock上是围绕QueryPerformanceCounter的包装器,它具有很好的精度,但我认为,作为网络任务的时间戳毫无用处。

所以问题是如何"同步"网络上的高分辨率时钟?

std::chrono::system_clock's Epoch当前未指定。但是,这是自1970-01-01 00:00:00 UTC以来的时间量度,忽略了LEAP秒。这与所谓的unix时间一致。

我目前正在努力标准化这种现有实践。我有std::chrono::system_clock实施者的私人,非正式的保证,他们不会在过渡期间改变现有的实践。

其他两个std定义的计时时钟: high_resolution_clocksteady_clock,没有适当定义的时期。

请注意,尽管system_clock具有(feacto)便携式时期,但没有便携式精度。在clang/libc 上,精度是微秒。在GCC上,精度是纳秒,在窗户上的精度为100n。因此,您可以time_point_cast<microseconds>(system_clock::now())获得便携式精度。

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