是否有无锁矢量实现?

时间:2012-02-21 22:05:57

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

谷歌“锁定免费载体”的第一个结果是由Damian Dechev,Peter Pirkelbauer和Bjarne Stroustrup描述理论无锁向量的研究论文。是否实现了这个或任何其他无锁向量?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-6)

我只是在维基百科中查找了一个矢量。

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

考虑;你创建数组,按照正常情况访问它等。为此你不需要无锁。当你需要调整大小时,问题出现了。进来的线程发现这需要malloc。这是一个真正独特的操作 - 此时其他线程必须阻塞/旋转。如果他们试图提供帮助,例如自己做malloc,你可以有很多线程发出malloc。现在它可能在实践中线程的数量是这么低,没关系 - 在这种情况下你可能有许多线程执行malloc,赢家自动激活新的内存和输家看到这个然后自由(记住他们的记忆。

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

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

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

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