繁体   English   中英

无链接列表的无锁编程

[英]Lock-free programming without linked lists

我多次读过,链接列表充其量只是一个不适合通用目的的利基数据结构,因为它们的缓存局部性较差。 然而,我见过的几乎所有无锁数据结构的例子都使用链表。 例如, C ++ Concurrency in ActionArt of Multiprocessor Programming在其无锁堆栈和队列的实现中使用链表。

在设计无锁容器(例如堆栈和队列)时,是否有更好的链接列表替代方法?

在设计无锁容器时,是否有更好的替代链表

是的,可能是出于某些目的。 链表是最简单的,可以很好地适用于许多应用程序。


如果使用单链表(在最简单的情况下),您可以填充一个完全没有同步问题的节点( =多个线程可以同时填充节点 ),唯一的同步操作是头指针交换。

因此,虽然链接列表没有以其他方式提供性能,但您可以将这种推广看作任意大型和复杂的节点,以及生产者和消费者的任意数量。

比较循环缓冲区:如果你有多个生成器,你需要一些方法来标记保留的缓冲区的一部分(受其他写入保护),然后才能读取。 这是因为所有生产者共享相同的缓冲区,而不是在自己的节点上工作。 它是可行的,但基本上是非原子的,只是因为你无法以与准备单独节点相同的方式准备共享缓冲区的一部分远离其他线程的窥探眼睛。

如果你有一个单一的生产者,它很容易,并且它确实具有比链表更好的位置,但它显然不那么通用

链表并不一定意味着缺乏地方性。 如果列表中的所有节点都是通过单个分配(C中的malloc)分配的,那么无论节点如何指向彼此,所有节点的内存都将是连续的。 如果sizeof(node)* max_nodes_count相对较小,则它可能适合各种缓存级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM