Asynchronous 根锁、子锁和多锁

Asynchronous 根锁、子锁和多锁,asynchronous,locking,distributed,Asynchronous,Locking,Distributed,我所拥有的简化结构是: 一些单根 每个根都有许多子元素(例如100个) 用户可以更新根目录信息,不允许对子目录执行其他操作(因为根目录更改可能会影响所有子目录) 此外,用户还可以对子对象进行操作(当然,如果root未被使用)。例如,用户可以同时更改2个子项,这是允许的,因为每个子项都是独立的 我需要此结构中的锁,以确保没有损坏: 使用儿童时,锁定儿童。这将不允许在同一时间对同一子级执行两个操作 使用root时,锁定root和所有子级。这将禁止在根目录更新时对任何子目录执行操作 这里让我烦

我所拥有的简化结构是:

  • 一些单根
  • 每个根都有许多子元素(例如100个)
用户可以更新根目录信息,不允许对子目录执行其他操作(因为根目录更改可能会影响所有子目录)

此外,用户还可以对子对象进行操作(当然,如果root未被使用)。例如,用户可以同时更改2个子项,这是允许的,因为每个子项都是独立的

我需要此结构中的锁,以确保没有损坏:

  • 使用儿童时,锁定儿童。这将不允许在同一时间对同一子级执行两个操作
  • 使用root时,锁定root和所有子级。这将禁止在根目录更新时对任何子目录执行操作
这里让我烦恼的是需要锁定所有的孩子——在一个分布式系统中,这意味着向分布式锁发送那么多请求


有没有更好的解决办法我看不出来?

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

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

阅读:

  • 读取锁节点和所有父节点直到根节点
  • 阅读
  • 释放所有读锁
  • 写入:

  • 写入锁定要修改的节点的最小上限。如果要修改节点(可能还有它的任何子节点),请写入锁定该节点
  • 做你的修改
  • 释放写锁
  • 这意味着可以同时修改两个同级,并且可以同时执行任意数量的读取。然而,阅读的代价是,对于一棵每层大约有100个子树,您需要获取O(log100(tree_height))读锁。这不太可能是一个真正的问题,除非你的树很大,对同一个叶节点有很多读写操作

    这假设没有子级可以修改其父级