锁定自由同步

Bob*_*r02 6 multithreading synchronization locking lock-free

我的问题与多线程无锁同步有关.我想知道以下内容:

  1. 实现这一目标的一般方法是什么?我在某处读过有关LockFreePrimitives的内容,比如CompareAndExchange(CAS)或DoubleCompareAndExchange(DCA),但没有给出解释?MINIMIZE使用锁的任何方法?

  2. Java/.NET如何实现其并发容器?他们使用锁或无锁同步吗?

提前致谢.

Tud*_*dor 6

假设您的算法具有一些特定的可利用特征,以下是一些可以最小化锁的使用的一般方法:

  1. 更新单个数字变量时,可以使用非阻塞原语,如CAS,atomic_increment等.它们通常比经典的阻塞关键部分(lock,mutex)快得多.

  2. 当一个数据结构由多个线程读取,但只由一个或几个线程写入时,一个明显的解决方案是读写锁,而不是完全锁.

  3. 尝试利用细粒锁定.例如,不是使用单个锁锁定整个数据结构,而是查看是否可以使用多个不同的锁来保护数据结构的不同部分.

  4. 如果您依赖于锁的隐式内存栅栏效应来确保跨线程的单个变量的可见性,则只需使用volatile1(如果可用).

  5. 有时,使用条件变量(和相关的锁)在实践中太慢.在这种情况下,volatile忙碌旋转效率更高.

关于这个主题的更多好建议:http://software.intel.com/en-us/articles/intel-guide-for-developing-multithreaded-applications/

另一个SO问题的一个很好的解读:无锁多线程是真正的线程专家(不要被标题吓到).

最近讨论的atomic_decrement的无锁Java实现:非阻塞方法中的Starvation


1采用volatile这里适用于诸如Java语言,其中volatile在存储器模型定义的语义,而不是C或C++,其中volatile前面引入跨线程存储器模型的并且不随它整合.这些语言中提供了类似的结构,例如std::memory_orderC++中的各种说明符.

  • @PeterCordes在C++中Java的"volatile"和"atomic <T>"之间的类比并不十分精确.从语法上讲,C/C++和Java中的`volatile`几乎是相同的:两者都是不改变访问底层值语法的限定符.语义上(内存模型)`volatile`有点像`atomic`的限制形式,你可以做的唯一事情就是用`memory_order :: acquire`加载并用`memory_order :: release`存储.Java中的各种`Atomic*`类基本上直接等同于`atomic <T>`(通常需要注意的是Java本身就是基于参考的). (2认同)