C# · 12月 26, 2021

c# – 比较结果的原子交换值

我有一个非常简单的操作需要原子地完成: if (a > b) b = a

其中a和b是整数

编辑:和一个是本地的.

有没有一种快速的方法在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指出这一点).