Volatile の読み取りと書き込み、および適時性に関する Joe Duffy の投稿を読んでいて、投稿の最後のコード サンプルについて何かを理解しようとしています。
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
…
2 番目の CMPXCHG 操作が実行されるとき、メモリ バリアを使用して、m_stateの値が実際に書き込まれた最新の値であることを確認しますか? それとも、プロセッサのキャッシュに既に格納されている値を使用するだけですか? ( m_stateが volatile として宣言されていないと仮定します)。
私の理解が正しければ、CMPXCHG がメモリ バリアを使用しない場合、最初にロックを取得したスレッドがすべてを取得する可能性が高いため、ロック取得手順全体は公平ではありません。次のロックの。私は正しく理解しましたか、それともここで何かを見逃していますか?
編集: 主な問題は、実際に CompareExchange を呼び出すと、m_state の値を読み取ろうとする前にメモリ バリアが発生するかどうかです。そのため、CompareExchange を再度呼び出そうとしたときに、すべてのスレッドに 0 の割り当てが表示されるかどうか。