【问题标题】:concurrent lock-free singly linked list C++ : does concurrency affect the interface? Do iterators still make sense?并发无锁单链表 C++:并发会影响接口吗?迭代器还有意义吗?
【发布时间】:2013-01-17 20:47:18
【问题描述】:

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

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

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

提前致谢!

【问题讨论】:

  • 为什么现有的迭代器会失效?它仍然指向一个有效节点,即使该节点的 pNext 已更改。至于并发性,您需要为整个列表设置一种 write_lock,或者每个节点一个(需要更多空间,但在多次插入期间等待更少)
  • @paddy 非常感谢!这很有趣:似乎他们将跳过列表实现为可靠的数据结构。稍后比较性能会很有趣..与fb竞争是一个挑战:)
  • @Rollie 是的,你是对的。迭代器不包含节点,而是指向它的指针,因此所有更新都是可见的。迭代器无效的唯一情况是删除它指向的节点。感谢您的澄清!根据并发性,每个节点的写锁看起来不错,唯一需要注意的是,我正在尝试采用无锁方法,所以它不是锁,而是守卫:)

标签: c++ list concurrency stl containers


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答!是的,最初我想锁定整个列表。很简单,here 的一些人提到了这种方法。唯一值得怀疑的是性能。即使访问了远处的元素,整个容器也会被锁定,如果容器很大,这可能是常见的情况。无论如何,一旦实现了跳过列表(我正在尝试将线程策略作为模板 arg),就很容易比较性能。
猜你喜欢
  • 2012-08-20
  • 2011-10-23
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多