我最近阅读了比较并交换原子操作(CMPXCHG,.NET的Interlocked.CompareExchange等)的内容。
我理解它的内部工作原理以及客户端如何使用它。
我不太确定的是,什么情况下会使用CAS?
维基百科说:
CAS 用于实现同步原语,例如信号量和互斥锁,同样还有更复杂的无锁和无等待算法。
因此,是否有人可以给我提供一个更通用的真实世界的用例,并附上CAS使用的代码和描述?
此问题意在与编程语言无关,因此任何语言都可以(C-based或x86汇编优先)。
谢谢!
我理解它的内部工作原理以及客户端如何使用它。
我不太确定的是,什么情况下会使用CAS?
维基百科说:
CAS 用于实现同步原语,例如信号量和互斥锁,同样还有更复杂的无锁和无等待算法。
因此,是否有人可以给我提供一个更通用的真实世界的用例,并附上CAS使用的代码和描述?
此问题意在与编程语言无关,因此任何语言都可以(C-based或x86汇编优先)。
谢谢!
Or
(在x86-64上,一个单独的lock or
指令)而不是CAS重试循环更有效率。最好不要从CAS合成东西,当语言可以用更简单的方式表达它们时,这些方式可以在某些机器上成为单个原子RMW指令。x86没有fetch_or
(尽管它通过lock xadd
有fetch_add),但对于单个位,它确实具有lock bts
以原子方式设置内存中的位并记录旧值。(位测试和设置) - Peter Cordesx &= x-1
)这样的东西作为CAS重试循环的演示;这是使用不同的Interlocked操作无法完成的。或者作为实现原子float
的一部分,如果C#不能为您完成。 - Peter Cordes