答えを見つけることができなかったいくつかの簡単な (できれば) 質問があります -
複数のスレッドにアクセスできるオブジェクト a、b があるとします。
Interlocked.Exchange(ref a, b)
「b」が揮発性でない場合、この操作はそれをそのように扱いますか? つまり、この変数の最新の値をメモリから取得しますか? もしそうなら、それは書き込みで「アトミック」に読み取られますか?Interlocked.Exchange の主な目的は、新しい書き込みによるアトミック操作として以前の値 'a' を取得することであることを理解しています。しかし、私の主な混乱は、「b」の値が実際に「a」に書き込まれることです。
私の 2 番目の質問は、この記事の引用に関連しています。
http://igoro.com/archive/volatile-keyword-in-c-memory-model-explained/
「興味深い点の 1 つは、C# でのすべての書き込みは、こことここで文書化されているメモリ モデルに従って揮発性であり、おそらくそのように実装されていることです。C# 言語の ECMA 仕様は、実際にはデフォルトで書き込みが揮発性ではない、より弱いモデルを定義しています。 ."
これは本当ですか?もしそうなら、「a」の以前の値を気にしない場合、Interlocked.Exchange の目的はありますか? (私の最初の例に関係する)。すべての書き込みが揮発性であることについて、StackOverflow に関する他の記事やコメントは見当たりません。ただし、書き込みはアトミックであることは理解しています。
編集:私の最初の質問への答えが「b」は揮発性として扱われないということであり、2番目の質問への答えが書き込みが実際に揮発性であるということである場合、フォローアップは、interlocked.exhangeが有用な場合はいつですか? 「a」の以前の値は気にしませんか?