树状结构中的多线程

时间:2013-01-28 08:41:48

标签: multithreading data-structures

以下是我在采访中被问到的问题,我相信这个问题有很多解决方案,但我想知道什么是最好的解决方案(而stackoverflow对此很完美:)。

问:我们有一个树状结构,有三个线程。现在我们必须执行三个操作:插入,删除和查找。你将如何设计呢?

我的方法:我将使用互斥锁进行插入和删除操作,因为我只想在插入或删除时执行一个线程。在查找的情况下,我将允许所有三个线程进入函数但保持计数(计数信号量),以便此次无法执行插入和删除操作。 类似地,当插入或删除操作进行时,不允许线程进行查找,与插入和删除的情况相同。

现在他交叉质疑我,因为我一次只允许一个线程插入所以如果需要插入不同叶子上的两个节点,那么我的方法一次只允许一个,这就被卡住了。

我的方法好吗? 还有什么其他办法?

1 个答案:

答案 0 :(得分:3)

这样怎么样?类似于交通路障(破损路径)。

  • 每个节点都会有两个标记leftClear_frightClear_f,表示提前clear-path
  • 树只有一个MutEx

查找操作:

  • 如果设置了标志,指示前方路径正在修改,则前往conditional_wait并等待信号。
  • 获取信号后
  • 检查标志并继续。

插入操作

  • 关注Lookup,直到您到达插入位置。
  • 在检查状态后,获取MutEx并设置parent_nodechild_node的相关标记。
  • 释放MutEx,以便在其他有效的不间断路径上发生并行Delete / Insert
  • 在插入操作后获取MutEx并更新parent_nodechild_node中的相关标记。

删除操作 与插入操作相同,但删除节点。

PS:您还可以在其他地方维护InsertDelete处理下的节点的详细信息。如有必要/需要,其他操作可以跳过破碎的路径!这听起来很复杂但可行。