【发布时间】:2012-02-08 20:58:46
【问题描述】:
存在大量关于无锁双向链表的研究。同样,在无锁跳过列表上也有大量研究。然而,据我所知,没有人管理过无锁的双向链接跳过列表。有没有人知道任何相反的研究,或者是这种情况的原因?
编辑: 具体场景是构建一个快速分位数(50%、75% 等)累加器。样本在 O(log n) 时间内被插入到跳过列表中。通过维护当前分位数的迭代器,我们可以在 O(1) 时间内将插入的值与当前分位数进行比较,并且可以轻松确定插入的值是在分位数的左侧还是右侧,以及分位数的多少结果需要移动。左移需要前一个指针。
据我了解,面对同时插入和删除的多个线程,任何困难都来自于保持先前的指针一致。我想这个解决方案几乎肯定会巧妙地使用指针标记。
【问题讨论】:
-
所以每次你向列表中添加一个项目时,你想去调整你的分位数数据,以便每个分位数知道它的起始值、范围以及指向分位数中起始项目的指针?我猜,如果跳过列表是脏的,那么根据请求计算分位数信息是不是太慢了?
-
@johnnycrash 每次插入时,您都知道每个分位数的值,因此您知道新值是否大于或小于分位数,以及分位数是否需要向前或向后移动由一个单位。我不确定您所说的范围是什么意思;分位数始终是单个值。在我最终使用的方案中,skip-list 方法的常数因子高于朴素方法,但随着操作数量的增加,它的扩展性非常好。每次插入更新分位数的成本是恒定的。
标签: lock-free doubly-linked-list skip-lists