以下是我在采访中被问到的问题,我相信这个问题有很多解决方案,但我想知道什么是最好的解决方案(而stackoverflow对此很完美:)。
问:我们有一个树状结构,有三个线程。现在我们必须执行三个操作:插入,删除和查找。你将如何设计呢?我的方法:我将使用互斥锁进行插入和删除操作,因为我只想在插入或删除时执行一个线程。在查找的情况下,我将允许所有三个线程进入函数但保持计数(计数信号量),以便此次无法执行插入和删除操作。 类似地,当插入或删除操作进行时,不允许线程进行查找,与插入和删除的情况相同。
现在他交叉质疑我,因为我一次只允许一个线程插入所以如果需要插入不同叶子上的两个节点,那么我的方法一次只允许一个,这就被卡住了。
我的方法好吗? 还有什么其他办法?
答案 0 :(得分:3)
这样怎么样?类似于交通路障(破损路径)。
leftClear_f
和rightClear_f
,表示提前clear-path
查找操作:
conditional_wait
并等待信号。插入操作
Lookup
,直到您到达插入位置。parent_node
和child_node
的相关标记。Delete
/ Insert
parent_node
和child_node
中的相关标记。删除操作 与插入操作相同,但删除节点。
PS:您还可以在其他地方维护Insert
或Delete
处理下的节点的详细信息。如有必要/需要,其他操作可以跳过破碎的路径!这听起来很复杂但可行。