Interlocked
クラスを使用してこれを行うためのきちんとした方法はありますか?それとも私はただ使うべきlock { }
ですか?
私の特定のユースケースは、値を計算し、long
それを共有の「最大」値と比較して、ローカル値が大きい場合にのみ共有値を置き換える複数のスレッドがあることです。
Interlocked
クラスを使用してこれを行うためのきちんとした方法はありますか?それとも私はただ使うべきlock { }
ですか?
私の特定のユースケースは、値を計算し、long
それを共有の「最大」値と比較して、ローカル値が大きい場合にのみ共有値を置き換える複数のスレッドがあることです。
Interlocked.CompareExchange
メソッドを試してください。私は試していませんが、このようなものは私には論理的に思えます:
long localMax = Interlocked.Read(ref max);
while (value > localMax) {
Interlocked.CompareExchange(ref max, value, localMax);
localMax = Interlocked.Read(ref max);
}
いつものように、コードのストレステストを行って、並行性の問題を見つけようとします。
共有フィールドの値が増加するだけである限り、との組み合わせでこのようなことを行うことができRead
ますCompareExchange
。
long sharedVal = Interlocked.Read(ref _sharedField);
while (localVal > sharedVal)
{
long temp = Interlocked.CompareExchange(ref _sharedField, localVal, sharedVal);
sharedVal = (temp == sharedVal) ? localVal : temp;
}
ただし、lock
この状況ではわかりやすく説明します。このように使用すると、ブロックInterlocked
よりも読みにくくなり、パフォーマンスが大幅に低下する可能性もあります。lock