我最近在阅读有关比较和交换原子操作(CMPXCHG、.NET 的 Interlocked.CompareExchange 等)的信息。
我了解它在内部是如何工作的,以及它是如何从客户那里使用的。
我不太清楚的是什么时候有人会使用 CAS?
维基百科说:
CAS 用于实现同步原语,如信号量和互斥锁,以及更复杂的无锁和无等待算法。
那么,谁能给我一个更通用的真实世界用例,其中包含 CAS 使用的代码和描述?
这个问题与语言无关,因此任何语言都可以(首选基于 C 或 x86 汇编)。
谢谢!
我最近在阅读有关比较和交换原子操作(CMPXCHG、.NET 的 Interlocked.CompareExchange 等)的信息。
我了解它在内部是如何工作的,以及它是如何从客户那里使用的。
我不太清楚的是什么时候有人会使用 CAS?
维基百科说:
CAS 用于实现同步原语,如信号量和互斥锁,以及更复杂的无锁和无等待算法。
那么,谁能给我一个更通用的真实世界用例,其中包含 CAS 使用的代码和描述?
这个问题与语言无关,因此任何语言都可以(首选基于 C 或 x86 汇编)。
谢谢!
通过示例很容易看出这一点。假设我们想在共享变量上原子地同时设置一些位:
int shared = 0;
void Set(int index) {
while (true) {
if (Interlocked.CompareExchange<int>(ref shared, shared | (1 << index), shared) == shared)
break; //success
}
}
如果我们看到“旧值”(即返回值)在此期间发生了变化,我们就会检测到失败。
如果这没有发生,我们就没有并发修改,所以我们自己的修改成功完成。
你可以使用这种技术实现相当复杂的东西。但是,越复杂,通过旋转造成的性能损失就越大。
我想强调 CAS 的一个关键特性是它可以失败并且可以可靠地检测到失败。
您使用 CAS 在一个线程或进程中原子地设置一个值(一个位或一个字),同时测试另一个线程/进程尚未这样做。所以它用于在多线程环境中获取标志或计数器。