14

我最近在阅读有关比较和交换原子操作(CMPXCHG、.NET 的 Interlocked.CompareExchange 等)的信息。

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

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

维基百科说:

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

那么,谁能给我一个更通用的真实世界用例,其中包含 CAS 使用的代码和描述?

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

谢谢!

4

3 回答 3

9

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

int shared = 0;

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

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

如果这没有发生,我们就没有并发修改,所以我们自己的修改成功完成。

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

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

于 2012-04-24T20:00:31.737 回答
5

您使用 CAS 在一个线程或进程中原子地设置一个值(一个位或一个字),同时测试另一个线程/进程尚未这样做。所以它用于在多线程环境中获取标志或计数器。

于 2012-04-24T22:03:11.917 回答
-1

那么,谁能给我一个更通用的真实世界用例,其中包含 CAS 使用的代码和描述?

本文使用 CAS 实现了一个无锁的线程安全队列。

它有一些伪代码示例。

于 2021-10-11T17:33:58.997 回答