我有一个非常简单的操作需要以原子方式完成:
if (a > b)
b = a
其中a和b是整数
编辑: a 是本地的。
在 C# 中有快速的方法吗?如果可能,我想避免手动锁定。我查看了 Interlocked.CompareExchange,但据我了解,这仅测试是否相等。
谢谢!
最佳答案
规范的方法是在循环中使用互锁的比较交换:
int oldvalue, newvalue ;
do {
oldvalue = b ; // you'll want to force this to be a volatile read somehow
if( a > oldvalue )
newvalue = a ;
else
break ;
} while( interlocked replace oldvalue with newvalue in b does NOT succeed );
(伪代码,因为我懒得去查找在 C# 中进行互锁交换的正确方法)。
如您所见,除非您有压倒一切的效率问题,否则使用普通的旧互斥体要简单得多,也更具可读性。
编辑:这假定 a
是局部变量或至少不受异步写入的影响。 a
和 b
都可以在你的背后修改,因此没有无锁的方式来自动更新。 (感谢 silev 指出这一点)。
关于c# - 根据比较结果自动交换值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7100187/