16

まず、std :: chronoの関数を呼び出すと、スレッドセーフであることが保証されていると想定しています(未定義の動作や競合状態、または別のスレッドから呼び出された場合に危険なものはありません)。私は正しいですか?

次に、たとえばWindowsでは、マルチコアプロセッサに関連するよく知られた問題があり、時間関連システムの一部の実装で、特定のコアに任意の時間情報を強制的に取得できるようにします。

私が知りたいのは:

  1. 標準でstd::chronoを使用して、ある種の問題が発生しないと考える保証はありますか?
  2. またはそれは実装が定義されていますか
  3. または、Windowsでは常に同じコアから時間を取得する方がよいことを意味する保証が明示的に欠如していますか?
4

2 に答える 2

7

はい、some_clock::now()異なるスレッドからの呼び出しはスレッドセーフである必要があります。

で言及した特定の問題に関しては、QueryPerformanceCounterWindowsAPIが一部のプラットフォームでハードウェアの問題を公開しているだけです。他のOSは、このハードウェアの問題をユーザーコードに公開する場合と公開しない場合があります。

C ++標準に関する限り、クロックが「定常クロック」であると主張する場合、逆方向に移動してはなりません。したがって、同じスレッドに2つの読み取りがある場合、2番目の読み取りが最初の値よりも前の値を返すことはありません。 OSがスレッドを別のプロセッサに切り替えた場合でも。

非定常クロック(std::chrono::system_clock多くのシステムなど)の場合、外部エージェントがクロックを任意に変更する可能性があるため、これについての保証はありません。

私のC++11スレッドライブラリstd::chronoものを含む)の実装では、安定したクロックが実際に安定していることを確認するために実装が注意を払っています。これにより、同期を確保するために生の呼び出しに加えてコストがかかりQueryPerformanceCounterますが、スレッドをCPU 0に固定することはなくなります(以前はそうしていました)。他の実装にもこの問題の回避策があると思います。

定常クロックの要件は20.11.3[time.clock.req](C ++ 11標準)です。

于 2012-07-04T14:01:43.790 に答える
-2

私は正直に言って、この質問は次のステートメントによって完全に答えられると信じています。実装にプラットフォーム固有のバグがないという保証はありません。すべてが完全に機能するはずですが、何らかの理由で機能しない場合があります。誰もあなたが望むことをすることをあなたに約束することはできませんが、それはうまくいくはずです。

于 2012-06-06T08:58:13.887 に答える