我的问题与多线程无锁同步有关。我想知道以下内容:
实现无锁同步的通用方法有哪些?我在某处读到过LockFreePrimitives,例如CompareAndExchange(CAS)或DoubleCompareAndExchange(DCA),但没有给出解释。有什么方法可以最小化锁的使用?
Java/.NET如何实现并发容器?他们使用锁还是无锁同步?
volatile
并不会像你期望的那样起作用。它可能会防止编译器进行某些优化,但不能防止处理器重新排序读取操作,因此无法替代屏障。 - ugorenvolatile
和C++中的atomic<T>
之间的类比并不是非常精确。从语法上讲,C/C++和Java中的volatile
基本相同:它们都是限定符,不会改变访问底层值的语法。从语义上讲(内存模型方面),volatile
有点像一种受限制的atomic
形式,其中您唯一能做的就是使用memory_order::acquire
进行加载和使用memory_order::release
进行存储。Java中的各种Atomic*
类基本上是atomic<T>
的直接等价物(通常情况下,Java是基于引用的)。 - BeeOnRopevolatile
的语义在表面上是相当合理的 - 实际上,人们在C / C ++中“自古以来”就使用volatile
进行跨线程通信(因为这是唯一半可移植的方法),至少MSVC使用与Java相同的发布/获取语义来形式化此过程。 - BeeOnRope