Interlocked.Exchange
とはどう違いVolatile.Write
ますか?
どちらのメソッドも、変数の値を更新します。誰かがそれぞれをいつ使用するかを要約できますか?
特にdouble
、配列のアイテムを更新する必要があり、別のスレッドに最新の値を表示させたいと考えています。何が好ましいですか?Interlocked.Exchange(ref arr[3], myValue)
またはVolatile.Write(ref arr[3], info);
どこarr
で宣言されていdouble
ますか?
実際の例では、次double
のように配列を宣言します。
private double[] _cachedProduct;
あるスレッドで、次のように更新します。
_cachedProduct[instrumentId] = calcValue;
//...
are.Set();
別のスレッドで、この配列を次のように読みました。
while(true)
{
are.WaitOne();
//...
result += _cachedProduct[instrumentId];
//...
}
私にとっては、そのままで問題なく動作します。ただし、「常に機能する」ことを確認するには、またはのいずれかを追加するVolatile.Write
必要がありInterlocked.Exchange
ます。二重更新はアトミックであることが保証されていないためです。
この質問への回答では、Volatile
とInterlocked
クラスの詳細な比較を見たいと思います。なぜ2つのクラスが必要なのですか? どちらをいつ使用するのですか?
運用中のプロジェクトでのロック メカニズムの実装からの別の例:
private int _guard = 0;
public bool Acquire() => Interlocked.CompareExchange(ref _guard, 1, 0) == 0;
public void Release1() => Interlocked.Exchange(ref _guard, 0);
public void Release2() => Volatile.Write(ref _guard, 0);
この API のユーザーがRelease1
またはRelease2
メソッドを呼び出した場合、実質的な違いはありますか?