有没有一种巧妙的方法可以使用类来做到这一点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
块的可读性差,而且性能也可能更差。