CAS属于读-修改-写(RMW)系列,这是一组算法,可让您自动执行复杂的事务。
具体来说,维基百科说
CAS用于实现同步原语,例如信号量和互斥量,以及更复杂的无锁和无等待算法。与原子读取,写入或获取和添加相比,CAS可以实现更多这些算法,并且假设有相当大的内存,它可以实现所有这些算法。
https://en.wikipedia.org/wiki/Compare-and-swap#Overview
因此,看来CAS算法是同类产品的“一刀切”。为什么呢?其他RMW算法缺少什么?如果CAS是最好的工具,那么其他算法还有什么用?
答案 0 :(得分:5)
CAS属于一类称为“共识对象”的对象,每个对象都有一个共识编号;给定共识对象可以解决共识问题的最大线程数。
共识问题是这样的:对于一定数量的线程n
,提出一些值p
并决定其中一个提议的值d
,这样n
线程同意d
。
CAS是最“强大”的共识对象,因为它的共识数是无限的。也就是说,CAS可用于解决理论上无限数量的线程之间的共识问题。 它甚至以免等待的方式进行。
这不能用原子寄存器,测试设置,获取加法,堆栈进行,因为它们都具有有限的共识数。有这些共识数字的证据,但这是另一回事了。
所有这些操作的意义在于,可以证明存在一个使用n
线程的对象的 free-free 实现,该对象使用共识对象为at的共识对象至少n
。 CAS特别强大,因为您可以使用它为任意数量的线程实现免等待对象。
为什么其他RMW操作有用?多处理中的某些问题实际上并不涉及解决任意数量线程的共识问题。例如,互斥可以使用功能较弱的RMW操作来解决,例如测试设置(简单的TAS锁定),访存(票证锁定)或原子交换(CLH锁定)。
在Wikipedia Consensus(computer_science)部分,有关共享内存共识的更多信息:In_shared-memory_systems
此外,我强烈建议在Herlihy和Shavit的多处理器编程的艺术(WorldCat)中整章讨论共识和通用结构。