在什么情况下无锁数据结构比基于锁的数据结构快?

bob*_*eff 5 c++ concurrency multithreading lock-free data-structures

我目前正在阅读Anthony Williams撰写的《 C ++ Concurrency in Action》一书,其中有几种无锁数据结构实现。在安东尼所写的关于无锁数据结构的章节的前面,他正在写作:

这给我们带来了无锁和无等待代码的另一个缺点:尽管它可能增加数据结构上操作并发的可能性,并减少单个线程花在等待上的时间,但它可能会降低整体性能。

的确,我针对前一章中基于锁的实现测试了本书中描述的所有无锁堆栈实现。而且似乎无锁代码的性能始终低于基于锁的堆栈。

在什么情况下,无锁数据结构更理想,因此必须首选?

Ser*_*eyA 7

无锁结构的好处之一是它们不需要上下文切换。然而,在现代系统中,无竞争锁也是无上下文切换的。为了从无锁算法中受益(性能方面),必须满足几个条件:

  • 竞争必须很高
  • 应该有足够的 CPU 核心,以便旋转线程可以不间断地运行(理想情况下,应该固定到自己的核心)

  • 争用不是由缺少 cpu 核心引起的;而是由缺少 cpu 核心引起的。相反,当多个核心需要同时独占访问相同的数据时。 (3认同)

Don*_*ang 7

我几年前做过性能研究。当线程数较少时,无锁数据结构和基于锁的数据结构具有可比性。但是随着线程数量的增加,基于锁的数据结构在某些时候表现出急剧的性能下降,而无锁数据结构则扩展到数千个线程。