并发无锁单链表 C++ : 并发会影响接口吗?迭代器是否仍然有意义
concurrent lock-free singly linked list C++ : does concurrency affect the interface? Do iterators still make sense?
我即将在 c++ 上实现一个并发链接(单独)列表,并希望与以前可能遇到类似挑战的人澄清一些观点。背景:最初,该列表计划成为跳过列表的一部分,而跳过列表又是内存中索引的一部分。当我开始实现这一点时,我会想为什么不创建一个通用解决方案(以类似 stl 的方式),它可以在跳过列表旁边使用。但似乎并发容器的工作方式可能与单线程容器有很大不同。例如,插入和删除操作将迭代器作为 std::list 中的输入参数,但在并发实现的情况下,如果另一个线程在其附近修改列表,迭代器将无效。
如果列表是跳过列表的"层",这不是问题,因为在这种情况下它是排序的,并且可以避免迭代器。但我很好奇是否有人试图实施一个通用解决方案,以解决问题的方式。
另一个问题..是否值得使这样的容器与 stl 算法兼容?似乎它们中的大多数都可能由于并发而失败。
提前感谢!
创建实现std::list
接口并与 stl 算法完全兼容的并发链表容器非常容易。 您只需锁定每个操作的整个内容。 当然,这不是无锁的,这不是您想要的。
关键是并发性本身并不会使std::list
无法实现 - 使它变得困难的是特定的实现细节,而您的无锁标准可能会使这变得困难。 你只应该把它完全std::list
- 如果这样做有意义;由于此接口特别要求所有迭代器在整个列表修改过程中必须保持有效,因此这里的事情可能会变得有点毛茸茸的。 我不知道你用什么无锁算法来实现这一点,所以我不能真正评论。
只要满足迭代器保证,即使容器没有实现std::list
,容器也会与 stl 算法兼容,所以听起来你的问题是确保满足这些迭代器保证。
相关文章:
- 控制允许动态运行c++的并发操作数
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 节俭并发:未解决的外部问题
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 为重写std::exception的库生成swig接口时出错
- 内联如何影响模块接口中的成员函数
- COM 接口 c# 封送数组数组
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 如何绑定 C++ gRPC 客户端的网络接口
- 并发/多线程:是否可以以这种方式生成相同的输出?
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 如何从实现接口的模板化类实例访问结构
- 用于在并发环境中访问 MMIO 的软件模式
- 带有进度表的 curl 多接口程序
- 并发安全堆栈接口方法:正确与否?
- 并发无锁单链表 C++ : 并发会影响接口吗?迭代器是否仍然有意义