有人知道任何支持秩运算(即查找第k个元素)的无锁skiplist实现和/或研究论文吗?或者,有人知道这样的行动永远无法奏效的根本原因吗?
奖励积分:
不假定垃圾回收的实现。根据我的经验,相当多的研究论文忽视了记忆管理。
支持:
关于如何在常规skiplist中进行排名操作的描述:William Pugh 的"skiplist Cookbook"
对于更好的无锁skiplist描述之一:Keir Fraser 的"实用的无锁"
最好的无锁skiplist实现之一:http://www.1024cores.net/home/parallel-computing/concurrent-skip-list
与键、值和级别不同,是skiplist中元素的本地属性,不受与其他元素的操作的影响,元素的秩,即其在列表中的位置,是一个随着插入和删除秩较低的元素而变化的属性。因此,对于并发skiplist,元素的秩是非常短暂的,因为它可以在任何时刻通过插入或删除较低秩元素的并发运行操作来改变。
例如,假设您通过级别1列表对第k个元素进行线性搜索。在执行k步骤时,并发修改可能会添加或删除任意数量的先前元素,因此您刚刚找到的元素的当前级别实际上是未知的。此外,当线程执行k正向迭代时,可以在其当前位置和开始搜索时为k的元素之间进行并发更改。因此,搜索的结果既不是当前秩为k的元素,也不是搜索开始时秩为k的元素。这只是一些随机的元素!
简而言之,对于并发列表来说,元素的秩是一个定义不清的概念,按秩搜索是一个不清的操作。这就是为什么它永远无法工作的根本原因,也是为什么实现者永远不应该为提供这样的操作而烦恼的根本原因。