我多次读过,链接列表充其量只是一个不适合一般用途的利基数据结构,因为它们的缓存局部性较差。然而,我见过的几乎所有无锁数据结构的例子都使用链表。 C ++ Concurrency in Action 和 The 例如,多处理器编程的艺术在其无锁堆栈和队列的实现中使用链表。
在设计无锁容器(如堆栈和队列)时,是否有更好的链接列表替代方法?
答案 0 :(得分:1)
在设计无锁容器时,是否有更好的链接列表替代方案
是的,可能是出于某些目的。链表是最简单的,可以很好地适用于许多应用程序。
如果您使用单链表(在最简单的情况下),您可以填充一个没有同步问题的节点( =多个线程可以同时填充节点),并且只有同步操作是头指针交换。
因此,尽管链接列表不是为了提高性能而建议的,但是你可以看到这个概括到任意大而复杂的节点,以及生产者和消费者的任意数量。
比较循环缓冲区:如果你有多个生成器,你需要一些方法来标记保留的缓冲区的一部分(受其他写入保护),然后才能读取。这是因为所有生产者共享相同的缓冲区,而不是在自己的节点上工作。它是可行的,但基本上是非原子的,只是因为你不能像其他线程的窥探那样准备部分共享缓冲区,就像准备一个单独的节点。
如果您有一个单一的制作人,那么它很容易,并且它确实比链接列表具有更好的位置,但显然不那么通用。
答案 1 :(得分:1)
链表并不一定意味着缺乏地方性。如果列表中的所有节点都是通过单个分配(C中的malloc)分配的,那么无论节点如何指向彼此,所有节点的内存都将是连续的。如果sizeof(node)* max_nodes_count相对较小,则它可能适合各种缓存级别。