Task #3 索引迭代器
一个通用索引迭代器来有效地检索所有叶页。基本思想是将它们组织成一个链表,然后以特定方向遍历存储在 B+Tree 叶子页面中的每个键/值对。您的索引迭代器应遵循 C++17 中定义的迭代器的功能,包括使用一组运算符和 for-each 循环(至少具有增量、取消引用、等于和非)迭代一系列元素的能力。相等运算符)。请注意,为了支持索引的 for-each 循环函数,您BPlusTree
应该正确实现begin()
和end()
。
Task #4 并发索引
(采用多索引结构,利用每个节点独立的读写锁兼顾了多线程并发访问的安全性和效率)
您需要更新您原来的单线程B+Tree索引,使其能够支持并发操作。只有当子页面被认为是“安全的”时,线程才能释放父页面上的锁。注意,“安全”的定义可以根据线程正在执行的操作类型而变化:
搜索:
从根页面开始,读(R)锁在孩子,一旦到孩子页面,然后释放父页面的锁( release latch on parent as soon as you land on the child page.)。
插入:
从根页开始,子页上的写(W)锁。一旦孩子被锁上,检查它是否安全,在这种情况下,不满。如果子节点是安全的,则释放父节点上的所有锁(If child is safe, release all locks on ancestors.)。
删除:
从根页开始,子页上的写(W)锁存器。一旦孩子被锁上,检查它是否安全,在这种情况下,至少是半满的。(注意:对于根页面,我们需要用不同的标准来检查)如果子节点是安全的,那么释放父节点上的所有锁(If child is safe, release all locks on ancestors.)。