【发布时间】:2013-01-17 20:47:18
【问题描述】:
我即将在 C++ 上实现一个并发链接(单独)列表,并想与以前可能遇到类似挑战的人澄清一些观点。背景:最初该列表计划成为跳跃列表的一部分,而跳跃列表又是内存索引的一部分。当我开始实现这个时,我想为什么不创建一个通用解决方案(以类似 stl 的方式),它可以在跳过列表之外使用。但似乎并发容器的工作方式可能与单线程容器有很大不同。例如,插入和删除操作将迭代器作为 std::list 中的输入参数,但在并发实现的情况下,如果另一个线程修改其附近的列表,则迭代器将无效。
如果列表是跳过列表的“层”,这不是问题,因为在这种情况下它是排序的,并且可以避免迭代器。但我很好奇是否有人尝试实施通用解决方案来解决问题。
另一个问题.. 让这样的容器与 stl 算法兼容是否值得?看来它们中的大多数都可能由于并发而失败。
提前致谢!
【问题讨论】:
-
为什么现有的迭代器会失效?它仍然指向一个有效节点,即使该节点的 pNext 已更改。至于并发性,您需要为整个列表设置一种 write_lock,或者每个节点一个(需要更多空间,但在多次插入期间等待更少)
-
@paddy 非常感谢!这很有趣:似乎他们将跳过列表实现为可靠的数据结构。稍后比较性能会很有趣..与fb竞争是一个挑战:)
-
@Rollie 是的,你是对的。迭代器不包含节点,而是指向它的指针,因此所有更新都是可见的。迭代器无效的唯一情况是删除它指向的节点。感谢您的澄清!根据并发性,每个节点的写锁看起来不错,唯一需要注意的是,我正在尝试采用无锁方法,所以它不是锁,而是守卫:)
标签: c++ list concurrency stl containers