2

Interlockedクラスを使用してこれを行うためのきちんとした方法はありますか?それとも私はただ使うべきlock { }ですか?

私の特定のユースケースは、値を計算し、longそれを共有の「最大」値と比較して、ローカル値が大きい場合にのみ共有値を置き換える複数のスレッドがあることです。

4

2 に答える 2

4

Interlocked.CompareExchangeメソッドを試してください。私は試していませんが、このようなものは私には論理的に思えます:

long localMax = Interlocked.Read(ref max);
while (value > localMax) {
  Interlocked.CompareExchange(ref max, value, localMax);
  localMax = Interlocked.Read(ref max);
}

いつものように、コードのストレステストを行って、並行性の問題を見つけようとします。

于 2011-07-08T13:48:09.463 に答える
0

共有フィールドの値が増加するだけである限り、との組み合わせでこのようなことを行うことができ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

于 2011-07-08T14:09:03.900 に答える