Skip to content

比较并交换

Compare-and-swap · CAS

原子地比较内存值并在相等时写入新值、同时返回比较结果的读改写原语。

形式陈述

比较并交换 CAS 对共享位置 x、期望值 a 和新值 b 执行一个原子步骤:若当前 x=a,则写入 b 并报告成功;否则保持不变并报告失败或返回旧值。它可用于乐观并发循环,但原子比较只针对该位置和该次值相等,内存排序由具体接口另行规定。

直觉

线程先假设共享状态仍是自己观察到的旧值;只有假设未被其他线程破坏时才提交更新。

例子与边界

无锁计数器反复读取旧值并 CAS 到旧值加一,失败则重试。ABA 问题中值从 A 变 B 又回 A,CAS 无法察觉中间变化,可用版本标签或安全回收缓解。CAS lock-free 算法不自动 wait-free,个别线程可能一直失败。

推论与应用

CAS 是无锁栈、队列、原子引用、一次初始化和多数现代同步库的核心硬件原语。

参考资料
  • Maurice Herlihy and Nir Shavit, The Art of Multiprocessor Programming, rev. 1st ed., Morgan Kaufmann, 2012,Chs. 1–18。
  • Hagit Attiya and Jennifer Welch, Distributed Computing: Fundamentals, Simulations, and Advanced Topics, 2nd ed., Wiley, 2004,Chs. 1–18。