Interlocked
クラスを使用してこれを行うためのきれいな方法はありますか?または、ちょうどlock { }
を使用する必要がありますか?インターロックを使用してlongをテストし条件付きで更新する
具体的な使用例は、long
の値を計算し、それを共有 "最大"値と比較する複数のスレッドがあり、ローカル値が大きい場合にのみ共有値を置き換えることです。
Interlocked
クラスを使用してこれを行うためのきれいな方法はありますか?または、ちょうどlock { }
を使用する必要がありますか?インターロックを使用してlongをテストし条件付きで更新する
具体的な使用例は、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
のために行くだろう:これはlock
ブロック未満読み取り可能で、あまりにも多くの貧しいパフォーマンスの可能性を持っているようInterlocked
を使用します。
ここで運が悪いと申し訳ありませんが、「ロック」を使用してください。 – Blindy