是否存在无锁矢量实现

Is there a lock-free vector implementation?

本文关键字:实现 存在 是否      更新时间:2023-10-16

谷歌关于"无锁向量"的第一个结果是由Damian Dechev、Peter Pirkelbauer和Bjarne Stroustrup共同撰写的一篇研究论文,描述了一个理论上的无锁向量。这个或者任何其他的无锁向量已经实现了吗?

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

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

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

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

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

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

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

TBH,我不明白为什么有人会使用矢量。为什么不使用平衡的二叉树或散列呢?