[英]Singly-linked list insertion synchronization
假设我有一个排序的,单链接的N个整数列表,其中没有重复项,并且k个线程(其中k << N ),每个都尝试将一些整数(大于头节点)插入到列表中。
是否可以将插入同步到这样的列表中,以便:
?
首先,如果插入集合只是一个非常罕见的任务,那么链表不是一个很好的解决方案 - 因为找到插入点是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
if (new->value == next->value) return; // someone beat us to it
cur = cur->next
并重复跳舞(列表已排序,有人插在我们面前) 即尝试链接新节点的结果是要么我们成功,要么有人打败我们插入相同的节点(在这种情况下我们没有 - 它已经存在),或有人插入间隙(即现有的是N
, N+3
,我们尝试了N+1
,其他人成功了N+2
)在这种情况下我们重试直到我们成功或者找到其他人完成的“我们的”节点。
同步删除要困难得多; 查找RCU(读取 - 复制 - 更新)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.