我应该如何在共享树数据结构中处理线程同步?

时间:2010-11-30 11:15:05

标签: concurrency

这只适用于一种并发复习......

想象一下,我在内存中有一个B +树数据结构 - 每个节点有多个项目,只有叶子节点包含项目,叶子节点也形成一个链接列表,便于顺序访问。插入和删除通常仅影响叶节点,但可能导致节点在可能传播到根的进程中拆分或合并。

我有一个单线程实现,更新遵循一种预先规划的方法。在节点需要更改的情况下,递归会从叶级别逐步提升树,构建链接列表(链接不同递归中的局部变量),以描述所需的更改。当它知道需要什么时,它可以检查它是否可以分配所有需要的节点,并在退出递归之前通过引用该计划来应用所有需要的更改。

此实现还“维护”更新的迭代器,因此插入/删除不会使迭代器失效,除非它们指向的特定项被删除。在同一节点内插入/删除会导致指向该节点的迭代器被更新。

麻烦的是,我需要让它成为多线程 - 同时支持潜在的许多读者和作者。

我希望多个读者能够同时读写,只要不存在腐败风险。因此,对于阅读,我根本不需要互斥访问,甚至不需要单个节点。对于写入,我想锁定更改所需的最小节点数。当然,我想避免陷入僵局。

值得庆幸的是,这不是我真正需要做的事情 - 但由于我忽略了我的并发技能,这似乎是一个很好的思想实验。

这显然与数据库和文件系统必须处理的问题类似,所以我猜我可能会得到一些关于这种事情的引用,这将是很棒的。

那么 - 我将如何处理线程同步呢?我可以模糊地看到节点上的互斥锁和/或信号量的作用,但是我会使用什么策略来处理它们?

1 个答案:

答案 0 :(得分:1)

绝对具有挑战性的任务!我看到你是c ++程序员,但我相信在c ++中有类似于java的概念,我会尝试从java的角度提供帮助。

  

因此,对于阅读,我根本不需要互斥访问,甚至不需要单个节点

您可以使用ReadWriteLock。只要没有编写者,它就可以由多个读者线程同时进行。写锁是独占的。在写作时你只需要使用独占访问权限。你在c ++中有模拟吗?

  

当然,我想避免陷入僵局。

只需按级别顺序锁定多个节点(例如从上到下)。这样可以保证您免受死锁(这与Lamport的烘焙算法类似)。

对于数据库 - 它们通过杀死一个进程来解决死锁: - )。

另一个策略是以类似的方式实现解锁树结构Cliff Click如何实现解除阻塞的哈希映射(包含所有案例的状态机): video

干杯