【发布时间】:2010-12-01 09:13:36
【问题描述】:
这只是为了一种并发复习...
想象一下我在内存中有一个B+树数据结构——每个节点多个项目,只有叶节点包含项目,叶节点也形成一个链表,方便顺序访问。插入和删除大多只影响叶节点,但会导致节点在可能传播到根的进程中分裂或合并。
我有一个单线程实现,更新遵循一种预先计划的方法。只要节点需要更改,递归就会从叶级向上逐步上升,构建一个描述所需更改的链表(链接不同递归中的局部变量)。当它知道需要什么时,它可以检查它是否可以分配所有需要的节点,并在退出递归之前通过引用此计划来应用所有需要的更改(或不应用)。
此实现还在更新时“维护”迭代器,因此迭代器不会因插入/删除而失效,除非它们指向的特定项目被删除。在同一节点内插入/删除会导致指向该节点的迭代器被更新。
问题是,我需要让它成为多线程的——同时支持潜在的许多读者和作者。
我希望多个阅读器能够同时读写,只要不存在损坏的风险。因此,对于阅读,我根本不想要互斥访问,即使是对单个节点也是如此。对于写作,我想锁定更改所需的最小节点数。当然,我想避免僵局。
谢天谢地,这不是我真正需要做的事情 - 但由于我忽略了我的并发技能,这似乎是一个很好的思想实验。
这显然类似于数据库和文件系统必须处理的各种问题,所以我猜我可能会得到一些关于这类事情的参考,这会很棒。
那么 - 我将如何处理线程同步呢?我可以隐约看到节点上互斥锁和/或信号量的作用,但我会使用什么策略来处理它们?
【问题讨论】:
标签: concurrency