c++ - 无链表的无锁编程

标签 c++ multithreading linked-list

我多次读到,链表充其量只是一种小众数据结构,由于其缓存局部性较差,不适合一般用途。然而,我所见过的几乎所有无锁数据结构示例都使用链表。 C++ 并发实践The 例如,多处理器编程艺术在其无锁堆栈和队列的实现中使用链表。

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

最佳答案

Are there better alternatives to linked lists when designing lock-free containers

是的,可能出于某些目的。链表只是最简单的东西,可以很好地推广到许多应用程序。


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

因此,虽然链表没有针对性能提出其他建议,但您可以看到这可以推广到任意大和复杂的节点,以及任意数量的生产者和消费者。

比较循环缓冲区:如果你有多个生产者,你需要一些方法来标记缓冲区的一部分在可供读取之前保留(防止其他写入)。这是因为所有生产者都共享同一个缓冲区,而不是在他们自己的节点上工作。它是可行的,但本质上是非原子的,只是因为您无法像准备一个单独的节点那样准备共享缓冲区的一部分以避开其他线程的窥探。

如果您有一个生产者,这很容易,而且它确实比链表具有更好的局部性,但显然不太通用

关于c++ - 无链表的无锁编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41044417/

相关文章:

c++ - 手动锁定唯一/共享 boost 锁

java - 添加到已排序的 `linkedList`

c# - 自定义集合无法实现 IEnumerable<T>

java - C++ 中的模板继承(移植 Java 代码)

c++ - Qt:使用模板函数将作用域枚举转换为字符串

c++ - 派生类对象是否包含基类对象?

java - 多线程正确性 : Using synchronized block

java - 多线程 Spring-boot Controller 方法

c++ - 如何在带有访问者的lambda中调用std::visit,访问者是按值捕获的函数对象

c - 我不明白deleteall(key)函数中这条语句 "cur = prev->next;"的逻辑