CAS属于读-修改-写(RMW)家族,这是一组允许您以原子方式执行复杂事务的算法。
具体来说,维基百科是这么说的
CAS用于实现同步原语,如信号灯和互斥体,以及更复杂的无锁和无等待算法。[…比起原子读、写或取并添加,CAS可以实现更多的这些算法,并且假定有相当大的内存,[…]它可以实现所有这些。
CAS属于读-修改-写(RMW)家族,这是一组允许您以原子方式执行复杂事务的算法。
具体来说,维基百科是这么说的
CAS用于实现同步原语,如信号灯和互斥体,以及更复杂的无锁和无等待算法。[…比起原子读、写或取并添加,CAS可以实现更多的这些算法,并且假定有相当大的内存,[…]它可以实现所有这些。
https://en.wikipedia.org/wiki/Compare-and-swap#Overview
因此,CAS算法似乎是其类别的“一刀切”产品。为什么会这样?其他RMW算法缺少什么?如果CAS是最好的工具,那么其他算法是做什么用的呢?
CAS属于一类被称为“共识对象”的天体,每个天体都有一个共识编号;给定一致对象可以解决一致问题的最大线程数。
共识问题是这样的:对于线程数n,建议设置某个值p然后决定其中一个建议值d这样n线程同意d.
CAS是最“强大”的共识对象,因为它的共识数是无限的。也就是说,CAS可以用于解决理论上无限多个线程之间的一致问题。它甚至以无等待的方式进行操作。
原子寄存器、测试-设置、获取-添加和堆栈都不能做到这一点,因为它们的一致数都是有限的。这些共识数字是有证据的,但那是另一回事……
这一切的意义在于,它可以证明存在一个无等待一个对象的实现使用一致数至少为n的一致对象的线程。CAS特别强大,因为您可以使用它为任意数量的线程实现无等待对象。
为什么其他RMW操作是有用的?多处理中的一些问题实际上并不涉及为任意数量的线程解决一致问题。例如,互斥可以使用功能不那么强大的RMW操作来解决,比如test-and-set(一个简单的TAS锁)、fetch-add(票据锁)或原子交换(CLH锁)。