(これは、Interlocked.Increment'ed int フィールドを正しく読み取る方法の繰り返しですが、回答とコメントを読んだ後でも、正しい答えがわかりません。)
私が所有しておらず、いくつかの異なるスレッドで int カウンター (numberOfUpdates) をインクリメントするロックを使用するように変更できないコードがいくつかあります。すべての呼び出しは次を使用します。
Interlocked.Increment(ref numberOfUpdates);
コードで numberOfUpdates を読み取りたい。これは int であるため、引き裂くことができないことがわかります。しかし、可能な限り最新の値を確実に取得するにはどうすればよいでしょうか? 私のオプションは次のようです:
int localNumberOfUpdates = Interlocked.CompareExchange(ref numberOfUpdates, 0, 0);
または
int localNumberOfUpdates = Thread.VolatileRead(numberOfUpdates);
両方とも機能しますか (最適化、並べ替え、キャッシュなどに関係なく、可能な限り最新の値を提供するという意味で)? どちらが優先されますか?より良い第 3 のオプションはありますか?