无锁,恒定的更新时间并发树数据结构?


20

我最近阅读了一些文献,并且发现了一些相当有趣的数据结构。

我研究了各种不同的方法来将更新时间降低到最坏情况下的更新时间[1-7]。O(1)

最近,我开始研究无锁数据结构,以支持有效的并发访问。

在无锁数据结构的实现中是否使用了这些最坏情况下的更新时间技术?O(1)

我问是因为 在我看来,它们似乎是这种“理论上的增强”的明显实践扩展。


  1. Tarjan,Robert Endre。“以O(1)循环更新平衡的搜索树。”《信息处理快报》,第16号,否。5(1983):253 – 257。

  2. Driscoll,JR,N Sarnak,DD Sleator和RE Tarjan。“使数据结构持久化”。在第18届ACM计算理论年度学术会议论文集中,109-121。STOC '86。美国纽约州:ACM,1986年。

  3. Levcopoulos,C。和Mark H. Overmars。“具有O(1)最坏情况更新时间的平衡搜索树。” Acta Inf。26号 3(1988年11月):269-277。

  4. 鲁道夫·弗莱舍。具有O(1)最坏情况更新时间的简单平衡搜索树

  5. Dietz,Paul F和Rajeev Raman。“一个恒定的更新时间手指搜索树。”信息处理,第52号信。3(1994):147 – 154。

  6. Lagogiannis,George,Christos Makris,Yannis Panagis,Spyros Sioutas和Kostas Tsichlas。“具有最坏情况下恒定更新时间的新动态平衡搜索树。” J. Autom。郎 梳子。8号 4(2003年7月):607-632。

  7. Brodal,GerthStølting,George Lagogiannis,Christos Makris,Athanasios Tsakalidis和Kostas Tsichlas。“指针机器中的最佳手指搜索树。” J. Comput。Syst。科学 67号 2(2003年9月):381-418。


2
请考虑向希望对您的问题进行调查的人添加到论文的链接。
拉斐尔

3
好的,添加到相应文章的链接中。
2012年

1
如果您很快没有收到有用的回复,建议您在cstheory.SE上重新发布(链接回到此处)。
JeffE 2012年

1
谢谢你的建议。我重新发布了:无锁,持续更新时间不变的并发树数据结构?
2012年

我以前使用过实用的无锁数据结构库。它们支持无锁树数据结构。也许有您想要的东西。
Reza

Answers:


4

O(1)

这意味着,如果您要对数据结构进行修改,则重要的特点是可以对私有数据结构进行所有修改,然后在单个原子指令中交换修改内容。

当您的数据结构是不可变的纯粹是功能性的)时,无锁通常是最容易的。您只需保留一个指向数据结构当前版本的全局指针。读者不需要锁定任何东西。数据结构的修改是通过将一个不变数据结构的全局指针交换到另一不变数据结构来实现的。

例如:如果您有一个纯粹的功能树平衡树,则:

  1. 记录当前的全局指针到树的根。
  2. 创建一个插入或删除节点的新树。(这是树中当前节点数在时间和空间上的对数,涉及从修改点到根创建新节点,并将所有新内容都指向数据结构以前版本的旧部分。 )
  3. 以原子方式比较并交换指向根的全局指针。(请注意,如果在记录旧的根指针到现在之间进行了另一次修改,则此操作可能会失败。如果发生这种情况,请返回到步骤1,然后重试。这就是所谓的“乐观并发控制”。)

请注意,最重要的部分是我上面所说的有关需要维护表示形式不变性的内容。 在原子树的中间进行原子更改通常是不够的。 为什么?例如:您可能有一个读取器线程,该线程正在对树进行预遍历。如果您修改的节点是其当前正在读取的节点的祖先,那么您将使他们认为已实施的前提条件无效。读者需要能够完全按照您进行更改之前或之后所做的操作来使用数据结构。两者之间没有东西。

O(log(N))O(N)


我认为主动等待技术(例如具有比较和交换功能)通常被称为“无锁”,因此即使在可变设置中也有一些出路。
拉斐尔

我不熟悉“ 主动等待 ”一词(Google对此没有帮助)。(如果您谈论的是Kogan和Petrank的工作,那说明了如何将无锁算法转变为无等待算法。)我添加了有关如何处理无锁变异性的编辑内容。
逻辑徘徊

“活性等待”我的意思是像while ( !P ) { noOp(); } doWork();在那里noOp可能是一个sleep或相似。
拉斐尔

在“ 编辑”部分中,您提到了使可变数据结构无锁的技术。如所示,我们复制整个数据结构,将mods复制到副本,然后使用CAS原语。但是,如何使Copy步骤原子化?这似乎是的另一个难题atomic snapshot
恒新

@hengxin:将CAS原语视为“发布”运算符。在发布数据结构之前,只有进行修改的线程可以访问它。数据结构发布后,它是不可变的。复制步骤不必是原子的,因为线程可以复制的唯一内容是发布的版本,它是不可变的。如果两个线程同时尝试进行变异,它们都将复制相同的不可变数据结构,修改其本地副本,然后CAS操作之一成功,而另一个失败。失败的那一个需要重新复制和更新。
Wandering Logic
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.