首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >没有链表的无锁编程

没有链表的无锁编程
EN

Stack Overflow用户
提问于 2016-12-08 16:36:04
回答 2查看 232关注 0票数 4

我曾多次读到,链接列表充其量不过是一种利基数据结构,由于它们的缓存局部性差,不适合通用用途。然而,我所见过的几乎所有无锁数据结构的例子都使用了链接列表。例如,C++并发性和多处理器编程艺术在实现无锁堆栈和队列时都使用链接列表。

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

EN

回答 2

Stack Overflow用户

发布于 2016-12-08 16:50:48

在设计无锁容器时,是否有更好的替代链接列表的方法?

是的,可能是为了某种目的。链接列表只是最简单的东西,可以很好地概括到许多应用程序中。

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

因此,尽管链接列表在其他方面没有被建议用于性能,但您可以看到这种概括为任意大且复杂的节点,以及任意数量的生产者和消费者。

比较循环缓冲区:如果您有多个生产者,您需要某种方法来标记保留的缓冲区的一部分(防止其他写入),然后才能用于读取。这是因为所有生产者都共享同一个缓冲区,而不是在自己的节点上工作。这是可行的,但本质上是非原子的,因为您不能像准备单独的节点那样,从其他线程的窥探眼中准备共享缓冲区的一部分。

如果您有一个单一的生产者,这是容易的,它确实有更好的局部性比一个链接的列表,但它显然不是一般的。

票数 2
EN

Stack Overflow用户

发布于 2016-12-08 19:11:47

链接列表并不一定意味着缺乏局部性。如果列表中的所有节点都是通过单个分配(malloc,C中的malloc)分配的,那么所有节点的内存将是连续的,而不管节点如何相互指向。如果(节点)* max_nodes_count的大小相对较小,那么它可能适合于不同的缓存级别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41044417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档