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

Why is compare-and-swap (CAS) algorithm a good choice for lock-free synchronization?

提问人:Ignorant 提问时间:5/31/2019 更新时间:6/1/2019 访问量:4084

问:

CAS 属于读-修改-写 (RMW) 系列,这是一组允许您以原子方式执行复杂事务的算法。

具体来说,维基百科说

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

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

因此,CAS 算法似乎是同类产品中“一刀切”的产品。为什么会这样?其他 RMW 算法缺少什么?如果 CAS 是最好的工具,那么其他算法的用途是什么?

多线程 算法 与语言无关的 原子

评论

1赞 willeM_ Van Onsem 5/31/2019
CAS 通常在处理器本身上实现,因此处理器保证原子性。这使得它相当高效,但也更容易,因为程序员不必关心它是如何实现的,只要处理器做正确的工作。

答:

12赞 Eric 5/31/2019 #1

CAS 属于一类称为“共识对象”的对象,每个对象都有一个共识编号;给定共识对象可以解决共识问题的最大线程数。

共识问题如下:对于一定数量的线程,提出一些值并决定其中一个建议的值,使线程达成一致。npdnd

CAS 是最“强大”的共识对象,因为它的共识数是无限的。也就是说,CAS 可用于解决理论上无限数量的线程之间的共识问题。它甚至以无等待的方式进行。

这不能用原子寄存器、测试和设置、fetch-add、堆栈来完成,因为它们都有有限的共识数。这些共识数字有证据,但那是另一回事了......

所有这一切的意义在于,可以证明存在一个对象的无等待实现,该对象使用共识数至少为 的共识对象。CAS 特别强大,因为您可以使用它为任意数量的线程实现无等待对象。nn

至于为什么其他RMW操作有用?多处理中的一些问题并不真正涉及解决任意数量的线程的共识问题。例如,可以使用功能较弱的 RMW 操作(如测试和设置(简单的 TAS 锁)、获取-添加(票证锁)或原子交换(CLH 锁))来解决互斥问题。

有关共享内存共识的更多信息,请参阅维基百科共识(computer_science)部分:In_shared-memory_systems

此外,我强烈推荐 Herlihy 和 Shavit 的《多处理器编程的艺术》(WorldCat)中有一整章是关于共识和通用结构的。

评论

0赞 Ignorant 7/12/2019
迟到的问题:那么,关于等待自由的共识问题是否只是?换句话说,我是否应该只在计划设计一个无等待(但不是无锁)算法时才考虑共识问题?
2赞 Eric 7/13/2019
当然,有些共识算法不是无等待的。但只有无等待共识才能用于构建无等待算法/数据结构。