是否有任何有效的(子)树锁定机制?

时间:2015-07-14 08:48:23

标签: multithreading algorithm data-structures tree locking

我有一个树T,其节点可以通过它们的路径寻址(节点的有效负载包含一些可以粘在一起的name个路径)。我想要的是一些机制(算法,辅助数据结构等),在给定路径P0的情况下,允许以这样的方式锁定整个子树:

  • 尝试锁定任何路径P1(其中P1 starts with P0,即P1属于锁定子树)将导致锁定P1P0 1}}(好吧,它可能不是完全相同的锁,但是P1上的操作应该等到P0锁定是免费的);
  • 释放P0锁时
  • P2的任何锁定,其中P2 starts with P0但不是 {{1} },即P2 starts with P1子树和P2子树不同,将为这两个路径授予不同的锁,依此类推。

我已经解决了这个任务了几次,但是我最后编写了一个过于复杂的代码,这些代码很乱,并且使用某种树来存储锁本身,这比我试图锁定的树还要重。 / p>

如果我的问题不清楚,请告诉我您是否希望看到一些图纸/图表或任何有用的信息。

2 个答案:

答案 0 :(得分:0)

免责声明:这与我在2009年所做的硬件分配非常相似,所以我记得基本的想法,而不是细节。无论如何,我建议以下想法:

树中的每个节点都拥有自己的锁。每个锁定操作都从树的根开始,然后向下朝向所需的节点,锁定每个节点。如果遇到锁定节点(不是根节点),则锁定操作终止(失败),或设置为等待并再次尝试(如忙等待)。如果root本身被锁定,则可能是发生另一个操作的临时锁定。如果根未锁定但是内部节点是,则真正锁定 解锁可能会有所不同,不确定是否需要遵循从根路径向下的路径。 (可能是,所以这值得检查)。

修改
在锁定所需节点后处理树时,还要将树路径上的节点标记为其子树中已锁定某些节点的节点。这样,当您锁定节点时,您可以知道该子树中是否存在已锁定的节点。

答案 1 :(得分:0)

我可能会遗漏一些东西,但我认为通过首先计算树的逆传递闭包可以很容易地解决你的需求,这可以用线性时间计算。

基本思想是知道一个节点是否可以安全操作,可以减少知道其父节点是否被锁定。

为此,您保留一组锁定的节点。通过简单地将其根添加到locked_nodes集来完成锁定子树,并且通过从同一集中移除其根来完成解锁子树(booth O(1)操作) 给定一个节点,以了解是否可以对该节点(或等效于该节点上的子树)进行操作:

{{1}}

set" parent(node)"是从逆传递闭包中提取的。