2017-12-05 17 views
2

タイムスタンプ付きのネットワーク経由でデータを送信する必要がありますが、今回は精度が高いはずです。 std::chronoクロックを見ると、std::chrono::*_clock::now()はクロックのエポックに依存するtime_pointを返すことがわかりました。各時計でどのエポックが使用されているかを知ることはできませんでしたし、ネットワーク経由で安全に使用できるエポックはどれですか。たとえばWindowsの場合、high_resolution_clockはQueryPerformanceCounterのラッパーですが、精度は高いですが、ネットワークタスクのタイムスタンプとしては役に立たないと思います。std chrono時刻同期

ネットワークで高解像度クロックを「同期する」方法はどうですか?

+0

非常に主観的な用語であるため、_ "高精度" _(あなたの投稿に)の定義を追加できますか?また、ローカルコンピュータのクロックを使用すると、おそらく十分正確ではないため、通信するコンピュータ間でネットワークを介して同期する時間を明確にすることができます。 –

答えて

2

std::chrono::system_clockのエポックは現在のところ指定されていません。ただし、1970年1月1日00:00:00 UTC以来の移植可能な時間の尺度であり、うるう秒を無視しています。これは、Unix Timeと一致しています。

私は現在standardize this existing practiceに働いています。 std::chrono::system_clockの作成者からの非公式の非公式な保証は、彼らがその間に既存の慣行を変更しないことを意味します。

他の2つのstd定義のクロノクロック:high_resolution_clockおよびsteady_clockは、移植可能に定義されたエポックを持っていません。

system_clockは、(事実上の)ポータブルエポックを持ちますが、移植性の高い精度がないことに注意してください。 clang/libC++では、精度はマイクロ秒です。 gccでは精度はナノ秒で、Windowsでは精度が100nsです。したがって、ポータブル精度を得るにはtime_point_cast<microseconds>(system_clock::now())かもしれません。

1

すべてのネットワークデバイスが同じNTPサーバーと定期的に同期するようにするには、まず「高精度」(より適切に指定する必要があります)同期が必要な場合。更新後(ミリ秒で正確でないネットワーク遅延によって)、クロックが再びドリフトし始めるため、数分(または秒)ごとにクロックを調整するためにマシンを構成する必要があります。

関連する問題