并发无锁单链表 C++ : 并发会影响接口吗?迭代器是否仍然有意义

concurrent lock-free singly linked list C++ : does concurrency affect the interface? Do iterators still make sense?

本文关键字:并发 接口 迭代器 是否 有意义 影响 单链表 C++ 链表      更新时间:2023-10-16

我即将在 c++ 上实现一个并发链接(单独)列表,并希望与以前可能遇到类似挑战的人澄清一些观点。背景:最初,该列表计划成为跳过列表的一部分,而跳过列表又是内存中索引的一部分。当我开始实现这一点时,我会想为什么不创建一个通用解决方案(以类似 stl 的方式),它可以在跳过列表旁边使用。但似乎并发容器的工作方式可能与单线程容器有很大不同。例如,插入和删除操作将迭代器作为 std::list 中的输入参数,但在并发实现的情况下,如果另一个线程在其附近修改列表,迭代器将无效。

如果列表是跳过列表的"层",这不是问题,因为在这种情况下它是排序的,并且可以避免迭代器。但我很好奇是否有人试图实施一个通用解决方案,以解决问题的方式。

另一个问题..是否值得使这样的容器与 stl 算法兼容?似乎它们中的大多数都可能由于并发而失败。

提前感谢!

创建实现std::list接口并与 stl 算法完全兼容的并发链表容器非常容易。 您只需锁定每个操作的整个内容。 当然,这不是无锁的,这不是您想要的。

关键是并发性本身并不会使std::list无法实现 - 使它变得困难的是特定的实现细节,而您的无锁标准可能会使这变得困难。 你只应该把它完全std::list - 如果这样做有意义;由于此接口特别要求所有迭代器在整个列表修改过程中必须保持有效,因此这里的事情可能会变得有点毛茸茸的。 我不知道你用什么无锁算法来实现这一点,所以我不能真正评论。

只要满足迭代器保证,即使容器没有实现std::list,容器也会与 stl 算法兼容,所以听起来你的问题是确保满足这些迭代器保证。