2

次のステートメント (最初と 3 番目のパラメーターと同じ変数をアドレス指定する) は、完了時に常に変数 b に変数 c の値を取得させますか、それとも、別のスレッドが 1 つ以上のパラメーターをフェッチ中に変更して最初のパラメーターを引き起こす可能性がありますか?比較操作中に異なる値を含めるための3番目のパラメーター?

a = Interlocked.CompareExchange(ref b, c, b)
4

1 に答える 1

2

これは興味深い質問です。答えは「保証されていない」と思われます。これは、フィールドの値がldfld(最後のパラメーター) の後、アドレスを介して評価される前 (以前に を介して取得)ldfldaに簡単に変更できるためですが、これは主に学術的なものです。このようなコードをスレッド化する場合と同様に、重要なことは、明らかに正しいことを行うことです。

明らかに「保証されていない」ということは、あまり判断できないため、役に立ちません。「保証されている」という答えが必要な場合は、単純に を使用する方が簡単で明白なため、質問は意味がありませんInterlocked.Exchange

于 2013-06-14T22:34:22.603 に答える