无锁非分配集合

Posted

技术标签:

【中文标题】无锁非分配集合【英文标题】:Lock free non-allocating collection 【发布时间】:2019-04-18 08:19:53 【问题描述】:

我正在寻找一个 collection 数据结构,它是:

    线程安全 无锁 非分配(摊销或预分配都可以) 非侵入式 不使用外来内在函数

元素顺序无关紧要。堆栈,队列,袋子,什么都可以。我找到了很多满足这五个要求中的四个的例子,例如:

.NET 的 List 不是线程安全的。 如果我在其上放置互斥体,则它不是无锁的。 .NET 的ConcurrentStack 是线程安全的、无锁的,使用简单的CompareExchange,但为每个元素分配一个新的Node。 如果我将 next 指针从 Node 移动到元素本身,那么它就是侵入性的。 Array based lock free data structures 往往需要多字内在函数。

我觉得我错过了一些非常明显的东西。这应该是一个已解决的问题。

【问题讨论】:

【参考方案1】: .NET 的ConcurrentQueue 满足所有五个要求。它会在后备存储空间不足时进行分配,类似于List<T>,但只要有额外的容量,就不会发生分配。不幸的是,预先预留额外容量的唯一方法是使用相同大小的集合对其进行初始化,然后将所有元素出队。 .NET 的ConcurrentBag 也是如此

【讨论】:

以上是关于无锁非分配集合的主要内容,如果未能解决你的问题,请参考以下文章

节点预分配向量中的无锁树节点分配

预分配的节点向量中的无锁树节点分配

使用无锁指针队列在线程之间移动数据是不是安全

c++11 并发队列的生产方案 BlockingConcurrentQueue

并发容器 - 各种队列

无锁队列真的比有锁队列快吗c++ linux后台开发