提问人:Ignorant 提问时间:5/31/2019 更新时间:6/1/2019 访问量:4084
为什么比较和交换 (CAS) 算法是无锁同步的不错选择?
Why is compare-and-swap (CAS) algorithm a good choice for lock-free synchronization?
问:
CAS 属于读-修改-写 (RMW) 系列,这是一组允许您以原子方式执行复杂事务的算法。
具体来说,维基百科说
CAS 用于实现同步基元,如信号量和互斥锁,以及更复杂的无锁和无等待算法。[...]CAS 可以实现比原子读取、写入或获取和添加更多的这些算法,并且假设内存量相当大,[...] 它可以实现所有这些算法。
https://en.wikipedia.org/wiki/Compare-and-swap#Overview
因此,CAS 算法似乎是同类产品中“一刀切”的产品。为什么会这样?其他 RMW 算法缺少什么?如果 CAS 是最好的工具,那么其他算法的用途是什么?
答:
CAS 属于一类称为“共识对象”的对象,每个对象都有一个共识编号;给定共识对象可以解决共识问题的最大线程数。
共识问题如下:对于一定数量的线程,提出一些值并决定其中一个建议的值,使线程达成一致。n
p
d
n
d
CAS 是最“强大”的共识对象,因为它的共识数是无限的。也就是说,CAS 可用于解决理论上无限数量的线程之间的共识问题。它甚至以无等待的方式进行。
这不能用原子寄存器、测试和设置、fetch-add、堆栈来完成,因为它们都有有限的共识数。这些共识数字有证据,但那是另一回事了......
所有这一切的意义在于,可以证明存在一个对象的无等待实现,该对象使用共识数至少为 的共识对象。CAS 特别强大,因为您可以使用它为任意数量的线程实现无等待对象。n
n
至于为什么其他RMW操作有用?多处理中的一些问题并不真正涉及解决任意数量的线程的共识问题。例如,可以使用功能较弱的 RMW 操作(如测试和设置(简单的 TAS 锁)、获取-添加(票证锁)或原子交换(CLH 锁))来解决互斥问题。
有关共享内存共识的更多信息,请参阅维基百科共识(computer_science)部分:In_shared-memory_systems
此外,我强烈推荐 Herlihy 和 Shavit 的《多处理器编程的艺术》(WorldCat)中有一整章是关于共识和通用结构的。
评论