c# - 根据比较结果自动交换值(value)

标签 c# .net multithreading synchronization atomic

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

if (a > b)
  b = a

其中a和b是整数

编辑: a 是本地的。

在 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 是局部变量或至少不受异步写入的影响。 ab 都可以在你的背后修改,因此没有无锁的方式来自动更新。 (感谢 silev 指出这一点)。

关于c# - 根据比较结果自动交换值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7100187/

相关文章:

java - 在一个AsyncTask实例上多次调用execute()时,线程是否同步运行

c# - User.Identity.GetUserId() 返回 null

c# - 在 n 列之间划分内容的最佳方法是什么?

c# - LINQ 中的 .Take 方法是否有通配符?

asp.net - 转换没有键或名称属性的配置文件

multithreading - 轻量级并发和重量级并发有什么区别?

c# - 传递给卸载的 AppDomain 的服务的内存泄漏

.net - 如何在 FlowDocument 中通过鼠标单击获取 TextPointer

.net - 如何说服管理层升级到 .Net 4.0

c# - RunWorkerAsync 完成时关闭BackgroundWorker