【问题标题】:Is there a lock-free vector implementation?是否有无锁向量实现?
【发布时间】:2012-02-21 22:05:56
【问题描述】:

Google 关于“无锁矢量”的第一个结果是由 Damian Dechev、Peter Pirkelbauer 和 Bjarne Stroustrup 合着的一篇研究论文,描述了理论上的无锁矢量。是否已经实现了这个或任何其他无锁向量?

【问题讨论】:

  • 可能是libcds?
  • 投反对票的人能解释一下自己吗?
  • @victor:说实话,建议的实现(从阅读你提到的文章的前几行)更像是一个双端队列而不是一个向量。你真正的要求是什么?如果您想要满足所有std::vector 要求的任何东西,答案很简单:它做不到。取决于您从std::vector 不需要的东西,它可能是可以实现的(我没有投反对票,但您应该明确提出您的要求,而且,如果您要求 lock-less,我不'不明白你为什么接受一个执行锁定的答案)
  • @DavidRodríguez-dribeas:公平地说,我认为 tbb::concurrent_vector 是无锁的。
  • @DavidRodríguez-dribeas:我看了这篇文章,它是向量而不是双端队列。绝对可以实现无锁向量。通常,通过让其他线程继续一个线程开始的工作,可以将每个锁定算法变成无锁算法。参见 Maurice Herlihy 的作品。这正是文章所描述的。也就是说,可能不值得进行无锁 resize 操作 - 无论如何,其余操作都很容易无锁。

标签: c++ vector concurrency lock-free concurrent-vector


【解决方案1】:

MS 提供 ppl::concurrent_vector,英特尔提供 tbb::concurrent_vector。在 Windows 上,至少 ppl 和 tbb 是 C-Runtime 的一部分。

【讨论】:

  • 并发和无锁是完全不同的东西
  • 你说得对,并发和无锁是不一样的。我的印象是 concurrent_vector 的 MS ppl 实现是无锁的。不是这样吗?
  • 我倾向于假设,除非另有说明,否则没有库是无锁的,并且我在快速查看说明 ppl::concurrent_vector 无锁的文档中没有看到任何参考。跨度>
  • 我浏览了 concurrent_vector.h 中的实现,它似乎是锁定和无锁定部分的混合。有趣的是,当不需要重新分配和压缩时,会发生无锁操作。
【解决方案2】:

我刚刚在维基百科中查找了向量是什么。

我认为(请注意,只需一两分钟的思考)完全无锁的版本有点问题。

考虑;您创建数组,按正常方式访问它等。为此,您不需要无锁。当您需要调整大小时,问题就来了。进来并发现这一点的线程需要malloc。这是一个真正独特的操作——此时其他线程必须阻塞/旋转。如果他们试图提供帮助,例如自己做 malloc,你可以有很多线程发出 malloc。现在可能在实践中执行的线程数量是如此之低,这没关系 - 在这种情况下,您可能有许多线程执行 malloc,获胜者原子地激活新内存,失败者看到这个然后释放( ) 记忆。

然后为了执行复制,当一个线程访问一个元素时,我们需要跟踪列表中的所有分配的数组,我们通过列表,最旧的在前,直到我们找到我们想要的元素,如果它不在最新的数组中,我们移动它然后访问它。

然后我们还需要一种方法让线程知道它已经移动了最后一个元素并可以释放该数组,因此我们必须对元素进行计数;所以我们有潜在的无限分配要求的风险。更重要的是,数据结构(我说过一个列表,但它可能是其他东西,虽然它们不会那么好,prolly)需要是原子的(因为也许线程可以同时删除一个数组)直到最近,原子无锁列表才是无锁数据结构的巅峰之作,尽管它们变得如此复杂,但需要 SMR 并且实现复杂。

(我说直到最近 - 有人最近发明了无锁红黑树,整个事情,添加和删除!)

TBH,我不明白为什么有人会使用矢量。为什么不直接使用平衡二叉树或哈希?

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 2012-06-17
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    相关资源
    最近更新 更多