是否存在无锁矢量实现
Is there a lock-free vector implementation?
谷歌关于"无锁向量"的第一个结果是由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,我不明白为什么有人会使用矢量。为什么不使用平衡的二叉树或散列呢?
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么使用 NDK 不能存在不同的 stl 实现?
- C++实现代码中的字符串不应存在于输出二进制文件中.如何解决
- clang实现char8_t的方式是否存在缺陷,或者标准的某个黑暗角落是否禁止优化?
- 用较少的内存在C++中实现2d数组
- unique_ptr实现中可能存在的错误
- 来自 vtable 的未定义符号是否意味着接口和实现之间存在错误
- DCT 实现存在问题
- 是否存在无锁矢量实现
- 运算符重载实现:0xC0000005:读取位置存在访问冲突
- 是否存在具有基本反射的轻量级信号槽实现
- 如何根据插入对的存在来实现不同的“std::map insert()”行为
- c++ 98:根据成员的存在提供不同的函数实现
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- c++或库中是否存在null std::ostream实现?
- 命令设计模式的实现存在一些错误
- 一个普通的可复制的::std::元组类模板可能吗?是否存在实现
- 是否存在作为一组Clang工具实现的C++重构模式
- 我在 OpenMP 中实现 Dijkstra 最短路径算法时可能存在的范围问题?
- Lamport 面包店算法的实现存在超过 1 个线程的 seg 错误