我有一个非常简单的操作需要原子地完成:
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指出这一点).