【发布时间】:2016-12-08 16:36:04
【问题描述】:
我曾多次读到,链表充其量只是一种不适合通用用途的利基数据结构,因为它们的缓存局部性很差。然而,我所见过的几乎每个无锁数据结构的例子都使用了链表。 C++ Concurrency in Action 和 The 例如,多处理器编程艺术在实现无锁堆栈和队列时使用链表。
在设计堆栈和队列等无锁容器时,有没有比链表更好的替代方案?
【问题讨论】:
-
循环缓冲区是一种常见的数据结构,可以同时提供无锁和局部性。 (但它通常具有有限的容量。)
-
您可以使用双端队列,它是链表和数组的混合体。想法是无锁链表很容易实现,而其他更复杂的数据结构有许多您必须考虑的极端情况。
-
@JorgeBellón 你有关于如何实现无锁 STL 类双端队列的资源吗?这对我来说似乎很难。
-
恐怕提供原子性的硬件指令对缓存不友好,因此更改数据结构可能无济于事
-
@Slava 引起争用的算法由于缓存一致性协议的乒乓效应对缓存不友好,但如果存在lock-free cache-awareness 的概念,那将是有原因的。
标签: c++ multithreading linked-list