加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:10:42 所属栏目:百科 来源:网络整理
导读:我有一个非常简单的操作需要原子地完成: if (a b) b = a 其中a和b是整数 编辑:和一个是本地的. 有没有一种快速的方法在C#中做到这一点?如果可能的话,我想避免手动锁定.我看过Interlocked.CompareExchange,但据我了解,这只是测试是否相等. 谢谢! 解决方法
我有一个非常简单的操作需要原子地完成:
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指出这一点).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读