次のステートメント (最初と 3 番目のパラメーターと同じ変数をアドレス指定する) は、完了時に常に変数 b に変数 c の値を取得させますか、それとも、別のスレッドが 1 つ以上のパラメーターをフェッチ中に変更して最初のパラメーターを引き起こす可能性がありますか?比較操作中に異なる値を含めるための3番目のパラメーター?
a = Interlocked.CompareExchange(ref b, c, b)
これは興味深い質問です。答えは「保証されていない」と思われます。これは、フィールドの値がldfld
(最後のパラメーター) の後、アドレスを介して評価される前 (以前に を介して取得)ldflda
に簡単に変更できるためですが、これは主に学術的なものです。このようなコードをスレッド化する場合と同様に、重要なことは、明らかに正しいことを行うことです。
明らかに「保証されていない」ということは、あまり判断できないため、役に立ちません。「保証されている」という答えが必要な場合は、単純に を使用する方が簡単で明白なため、質問は意味がありませんInterlocked.Exchange
。