4

カジュアルなシングルバイト変数があるとします。ほとんどすべてのシステムでシングルバイト操作はアトミックだと思いますが、そうでない場合はお知らせください。ここで、1 つのスレッドがこの変数を更新するとします。このアップデートが他のスレッドに表示されるまで、どれくらいの期間を期待/準備する必要がありますか? どこでも同期されるように、ミューテックス/ロック/バリアの周りに更新を配置できることは知っていますが、これについては興味があります。待機時間は、他のスレッドが別のプロセッサ/コア上にあるかどうか、およびプロセッサの種類によって異なる可能性があります。

私はこれを疑問に思うのは論理的ですか、それとも何かを大きく誤解していますか?

4

3 に答える 3

8

などの同期プリミティブ/メモリバリアを呼び出すとすぐに、メモリが同期されますpthread_mutex_lock。それとは別に、C11 アトミック型を使用していない限り、同期を想定しないでください。

于 2012-07-10T14:40:01.517 に答える
3

多くのアーキテクチャでは、プロセッサは、必要になるまでキャッシュをフラッシュしません。つまり、さらに必要なデータに道を譲るためです。

ただし、スレッドがメモリ空間を共有しいて、コアが 1 つしかない場合は、キャッシュから「すぐに」更新を確認できます。実際にCPUからメモリに書き込まれた場合。コンパイラがそれをレジスタに保持することを決定した場合、そうではない可能性があります。その場合、スレッドはすべて独自の「ローカル」で誤ったコピーを持つことになります。

他の人が言ったように、それは興味深い質問ですが、同期の正しい答えは、適切な同期プリミティブを使用することです!

于 2012-07-10T14:48:03.033 に答える
0

MIPS アーキテクチャでは、コア間のロード ストア バリアとして機能する同期命令があります。つまり、同期を発行する前のすべてのロードとストアは、同期後のロードとストアの前に発生します。x86 に同等の命令があるかどうかはわかりません (使用しているアーキテクチャ)。

于 2012-09-05T09:51:31.100 に答える