无链接编程没有链接列表

Lock-free programming without linked lists

本文关键字:链接 列表 编程      更新时间:2023-10-16

我多次阅读,链接的列表充其量是由于其较差的高速缓存位置而适合通用使用的利基数据结构。然而,我看到的几乎每个无锁数据结构的示例都使用链接列表。 c 并发例如,多处理器编程的艺术,例如,在实现无锁堆栈和队列时使用链接列表。

设计无锁容器时,是否有更好的替代方案,例如堆栈和队列?

设计无锁容器时,是否有更好的替代方案

是的,可能是出于某些目的。链接列表只是许多应用程序概括的最简单的东西。


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

因此,尽管没有其他建议的链接列表以进行性能,但您可以看到这些通用性,即任意大型且复杂的节点,以及任意数量的生产者和消费者。

比较圆形缓冲区:如果您有多个生产商,则需要某种方法来标记一部分保留的缓冲区(在其他文字中受到保护),然后才能阅读。这是因为所有生产商都共享相同的缓冲区,而不是使用自己的节点。它是可行的,但本质上是非原子,仅仅是因为您无法以相同的方式准备共享缓冲区的一部分 您可以准备一个单独的节点。

如果您有一个生产者,它很容易,并且确实比链接列表具有更好的位置,但是显然

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