什么是比较和交换有益?

时间:2012-04-24 08:19:49

标签: c# c assembly thread-safety compare-and-swap

我最近在阅读Compare And Swap原子动作(CMPXCHG,.NET的Interlocked.CompareExchange,无论如何)。

我理解它在内部是如何工作的,以及它是如何从客户端使用的。

我不太清楚的是,有人使用CAS的时间是什么时候?

维基百科说:

  

CAS用于实现同步原语,如   信号量和互斥量,同样更复杂的无锁和   等待算法。

那么,任何人都可以给我一个更通用的实际用例,其中包含CAS使用的代码和描述吗?

这个问题与语言无关,因此任何语言都可以(基于C语言或x86程序集首选)。

谢谢!

2 个答案:

答案 0 :(得分:8)

通过示例很容易看出。假设我们想要原子地并且同时在共享变量上设置一点:

int shared = 0;

void Set(int index) {
 while (true) {
  if (Interlocked.CompareExchange<int>(ref shared, shared | (1 << index), shared) == shared)
   break; //success
 }
}

如果我们发现“旧值”(即返回值)在此期间发生了变化,我们会检测到失败。

如果没有发生这种情况,我们没有进行同时修改,因此我们自己的修改成功完成。

使用这种技术你可以实现相当复杂的东西。但是,通过旋转,性能损失越大,越复杂。

我想强调CAS的一个关键属性是它可能会失败并且可以可靠地检测到失败。

答案 1 :(得分:5)

使用CAS在一个线程或进程中原子地设置值(一个或一个单词),同时测试另一个线程/进程尚未执行此操作。因此,它习惯于在多线程环境中获取标志或计数器。