为什么比较交换(CAS)算法是无锁同步的好选择?

时间:2019-05-30 17:23:37

标签: multithreading algorithm concurrency language-agnostic atomic

CAS属于读-修改-写(RMW)系列,这是一组算法,可让您自动执行复杂的事务。

具体来说,维基百科说

  

CAS用于实现同步原语,例如信号量和互斥量,以及更复杂的无锁和无等待算法。与原子读取,写入或获取和添加相比,CAS可以实现更多这些算法,并且假设有相当大的内存,它可以实现所有这些算法。

https://en.wikipedia.org/wiki/Compare-and-swap#Overview

因此,看来CAS算法是同类产品的“一刀切”。为什么呢?其他RMW算法缺少什么?如果CAS是最好的工具,那么其他算法还有什么用?

1 个答案:

答案 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)中整章讨论共识和通用结构。