在比较结果上的原子交换价值

dck*_*ney 6 .net c# multithreading synchronization atomic

我有一个非常简单的操作需要原子地完成:

if (a > b)
  b = a
Run Code Online (Sandbox Code Playgroud)

其中a和b是整数

编辑:和一个是本地的.

有没有一种快速的方法在C#中做到这一点?如果可能的话,我想避免手动锁定.我看过Interlocked.CompareExchange,但据我了解,这只是测试是否相等.

谢谢!

Hen*_*olm 8

规范的方法是在循环中使用互锁比较交换:

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 );
Run Code Online (Sandbox Code Playgroud)

(伪代码,因为我没有费心去查找在C#中进行互锁交换的正确方法).

如您所见,除非您具有压倒一切的效率问题,否则使用普通的互斥体会更简单,更易读.

编辑:这假定它a是一个局部变量或至少不受异步写入的影响.两者的它a,并b可以在你的背后进行修改,再有就是原子这样做更新不无锁的方式.(感谢silev指出这一点).