对无锁双链表进行了大量研究。同样,在无锁跳过列表上有大量的研究。然而,我可以告诉他们,没有人管理过无锁双链跳过列表。有没有人知道任何相反的研究,或者为什么会出现这种情况?
编辑: 具体方案是构建快速分位数(50%,75%等)累加器。样本在O(log n)时间内插入跳过列表。通过将迭代器保持为当前分位数,我们可以在O(1)时间内将插入的值与当前分位数进行比较,并且可以容易地确定插入的值是否在分位数的左侧或右侧,以及分位数是多少因此需要移动。这是左移动需要先前的指针。
据我了解,任何困难都来自于保持前面的指针在多个线程一次插入和删除时保持一致。我想这个解决方案几乎肯定会涉及巧妙地使用指针标记。
答案 0 :(得分:0)
但你为什么要做这样的事呢?我实际上并没有坐下来确定跳过列表是如何工作的,但是从我模糊的理解中,你永远不会使用之前的指针。那么为什么要维护它们的开销呢?
但如果你愿意,我不明白为什么你不能。只需用双向链表替换单链表即可。双向链表在逻辑上是连贯的,所以它都是一样的。
答案 1 :(得分:0)
我有个你的想法。我们使用“光标”来查找跳过列表中的项目。游标还会保留到达项目所需的路径。我们使用此跟踪进行删除和插入 - 它避免了第二次搜索以执行这些操作,并且它嵌入了在遍历时看到的列表的版本#。我想知道你是否可以使用光标更快地找到上一个项目。
您必须在光标上升一级,然后搜索仅略低于您的项目的项目。或者,如果搜索将其设置为链接列表的最低级别,则只需在遍历时保存prev ptr。最低级别可能有50%的时间用于查找您的项目,因此性能会很不错。
嗯......现在考虑一下,似乎光标会有50%的时间有上一个ptr,25%的时间需要从1级再次搜索,12%2级上升等等因此,在不经常的情况下,你必须完全重新进行搜索。我认为这样做的好处是你不必弄清楚如何“锁定免费”维护双链接跳过列表,并且在大多数情况下你会大大降低定位前一项的成本。