9

で読むことができるように:

https://svn.boost.org/trac/boost/ticket/3504

定期的にタイムアウトし、deadline_timer :: Expires_at()を使用して実装されるdeadline_timer(Boost Timerチュートリアルの例の3番目の例のように)は、システム時刻が変更された場合(たとえば、オペレーティングシステムの場合はdateコマンドを使用した場合)に失敗する可能性がありますLinuxです)。

Boostを使用して、この操作を実行するための簡単で適切な方法はありますか?有効期限を「手動で」更新するよりも精度が低いことを確認できたため、deadline_timer :: Expires_from_now()を使用したくありません。

一時的な解決策として、新しいexpires_at値を設定する前に、now()とexpires_at()の間の期間を計算することにしました。定期的な遅延の2倍以上の場合は、例外的にexpires_from_now()を使用して新しい絶対時間と再同期します。

4

1 に答える 1

9

Boost 1.49+では、Boost.Asioが提供しますsteady_timer。このタイマーはchrono::steady_clock、システムクロックの変更による影響を受けない単調なクロックを使用します。

Boost 1.49+を使用できない場合は、タイマーまたはクロックの変更を確認することが合理的な代替ソリューションです。これは実装の詳細ですが、Boost.Asioは、システム時間の変更を定期的に検出できるように、リアクターでのイベントの待機に費やす時間を制限する場合があります。たとえば、を使用したreactorの実装epollは、最大5分間待機します。したがって、リアクターに割り込みを強制することなく(タイマーに新しい有効期限を設定するなど)、システム時間の変更を検出する前にBoost.Asioに最大5分かかる場合があります。

于 2013-02-13T07:10:18.577 に答える