形式陈述
读改写原语原子地读取位置旧值,依据旧值计算并写回新值,同时返回旧值或成功标志。典型实例包括 test-and-set、fetch-and-add、swap 和 compare-and-swap。不同原语的共识数和可实现对象能力不同;“RMW”是类别,不是单一语义。内存序参数还决定跨位置的可见顺序。
直觉
把“查看当前值并据此更新”合成一个不可插入的动作,避免另一个线程在读写之间抢先修改。
例子与边界
原子 fetch_add(x,1) 可为每个线程返回不同旧值,构造计数器。用普通读后普通写实现同一代码会丢失更新。RMW 可能反复失败或争用,原子性不保证公平;在 ABA 场景中 CAS 看到值恢复相同却忽略中间变化。
推论与应用
RMW 原语用于自旋锁、无锁栈、工作队列、版本计数和共享内存同步下界。
参考资料
- 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。