根,儿童和多个锁

时间:2016-03-28 22:53:25

标签: asynchronous locking distributed

我所拥有的简化结构是:

  • 一些单根
  • 每个根有很多(例如100个)孩子

用户可以更新根信息,不允许对儿童进行其他操作(因为根更改可能会影响所有这些操作)。

此外,用户可以对孩子进行操作(当然,如果root不在使用中)。例如,用户可以在同一时间更换2个孩子,这是允许的,因为每个孩子都是独立的。

我需要在此结构中使用锁定以确保没有损坏:

  • 当儿童在使用时,锁定孩子。这不允许同时对同一个孩子进行两次操作。
  • 当root正在使用时,锁定root AND all 子项。这将禁止在root更新时对任何子节点的操作。

让我困扰的是需要锁定所有孩子 - 在分布式系统中,这意味着将多个请求发送到分布式锁定。

有没有更好的解决方案我不明白?

1 个答案:

答案 0 :(得分:0)

你错过了两件事。首先,只要没有人写入节点,多个线程同时从节点读取就是安全的。其次,子节点可以被视为它们自己的较小树的根,因此相同的算法/解决方案可以应用于除叶节点之外的所有节点。第一个是最重要的。以下是您如何做到这一点:

在树中的所有节点上使用读/写互斥锁。这允许任意数量的进程同时读取,或者单个进程随时写入节点。

阅读:

  1. 读锁定节点和所有父母一直到root。
  2. 读取。
  3. 释放所有读锁。
  4. 写:

    1. 写入锁定要修改的节点的最小上限。如果您正在修改节点(可能还有其任何子节点),请对该节点进行写锁定。
    2. 进行修改
    3. 释放写锁定
    4. 这意味着可以同时修改两个兄弟节点,并且可以同时执行任意数量的读取。但是,读取的成本是你需要获取O(log100(tree_height))读锁,对于每个级别大约有100个孩子的树。它不太可能是一个真正的问题,除非你的树很大,对同一叶子节点的读写次数非常多。

      这假设没有孩子可以修改其父母。