假设我有一个排序的,单链接的 N 整数列表,其中没有重复项, k 线程(其中 k << ; N ),每个都尝试将一些整数(大于头节点)插入到列表中。
是否可以将插入同步到这样的列表中,以便:
答案 0 :(得分:3)
首先,如果插入到集合中的任务非常罕见,那么链接列表不是一个很好的解决方案 - 因为查找插入点是O(N)
操作,即使对于排序列表,因此最终会严重缩放。
如果您仍然需要这样做,可以执行插入(与删除不同)作为无锁操作进入排序列表,并小心:
cur
cur
/ cur->next
)compare_and_swap(cur->next, new, new->next);
if (new->value == next->value) return; // someone beat us to it
cur = cur->next
并重复舞蹈(列表已排序,有人插在我们面前)即。尝试链接新节点的结果要么是我们成功了,要么是有人打败我们插入同一个节点(在这种情况下我们没关系 - 它已经存在),或者有人插入了一个空白(即存在是N
,N+3
,我们尝试N+1
,其他人成功N+2
)在这种情况下,我们会重试,直到我们成功或找到其他人完成“我们的”节点。< / p>
同步删除要困难得多;查找RCU(读取 - 复制 - 更新)。