メイン スレッドでグローバル変数 (C++) を作成し、その値を X に設定してから Y に設定します。その後、複数のスレッドを生成し、この変数から読み取ります。Y を読み取るという保証はありますか?
そうでない場合、read(shared)-mutex 保護で解決できますか? (ミューテックスはいつでも取得できますが)
複数のプロセッサのキャッシュを同期させるのは、正確には何ですか?
メイン スレッドでグローバル変数 (C++) を作成し、その値を X に設定してから Y に設定します。その後、複数のスレッドを生成し、この変数から読み取ります。Y を読み取るという保証はありますか?
そうでない場合、read(shared)-mutex 保護で解決できますか? (ミューテックスはいつでも取得できますが)
複数のプロセッサのキャッシュを同期させるのは、正確には何ですか?
スレッドを開始すると、暗黙的なメモリ バリアが導入されます。
C++11std::threads
は、§30.3.1.2 で構築するためにこれを保証します。
同期: コンストラクターの呼び出しの完了は、f のコピーの呼び出しの開始と同期します。
ここで、f はスレッドによって実行されている関数です。同期の定義については、§1.10 も参照してください(または、このブログ投稿を参照してください)。
簡単に言えば、異なるスレッドから同時に値を読み取っても安全であり、すべてのスレッドが最新の正しい値を読み取ることが保証されています。もちろん、これは、スレッドを開始した後に誰もその変数に書き込みを実行しない場合にのみ当てはまります。その場合、アトミックまたは明示的なロック (つまりミューテックス) が必要になります。
変数に割り当てた後にスレッドを生成するY
と、実際にその値が表示されます。
read(shared)-mutex 保護はそれを解決しますか?
ミューテックスは、変数を同時に変更する場合にのみ必要です (他の同時操作が読み取りまたは書き込みの場合)。変数を同時に変更しない場合 (ここの場合のように)、ミューテックスは必要ありません。
複数のプロセッサのキャッシュを同期させるのは、正確には何ですか?
通常、メモリ位置への書き込みは、他のプロセッサの対応するキャッシュ エントリを無効にします。その変数に再度アクセスすると、対応するプロセッサが必要に応じてキャッシュを再作成します。