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

前端之家收集整理的这篇文章主要介绍了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指出这一点).

猜你在找的C#相关文章