我最近在阅读Compare And Swap原子动作(CMPXCHG,.NET的Interlocked.CompareExchange,无论如何)。
我理解它在内部是如何工作的,以及它是如何从客户端使用的。
我不太清楚的是,有人使用CAS的时间是什么时候?
维基百科说:
CAS用于实现同步原语,如 信号量和互斥量,同样更复杂的无锁和 等待算法。
那么,任何人都可以给我一个更通用的实际用例,其中包含CAS使用的代码和描述吗?
这个问题与语言无关,因此任何语言都可以(基于C语言或x86程序集首选)。
谢谢!
答案 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在一个线程或进程中原子地设置值(一个或一个单词),同时测试另一个线程/进程尚未执行此操作。因此,它习惯于在多线程环境中获取标志或计数器。