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 回答