繁体   English   中英

单链表插入同步

[英]Singly-linked list insertion synchronization

假设我有一个排序的,单链接的N个整数列表,其中没有重复项,并且k个线程(其中k << N ),每个都尝试将一些整数(大于头节点)插入到列表中。

是否可以将插入同步到这样的列表中,以便:

  • 线程可能只阻止对其(直接)前一节点的访问
    (没有锁定“整个列表”)
  • 最多可以使用O(k)互斥量和条件变量
  • 不会发生抢占/中断

首先,如果插入集合只是一个非常罕见的任务,那么链表不是一个很好的解决方案 - 因为找到插入点是O(N)操作,即使对于排序列表,因此最终缩放严重。

如果你仍然需要这样做,可以将一个插入(不像删除)作为无锁操作执行排序列表,但要小心:

  1. 找到插入点, cur
  2. 创建新节点(指定上一个/下一个链接到cur / cur->next
  3. 原子操作: 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并重复跳舞(列表已排序,有人插在我们面前)

即尝试链接新节点的结果是要么我们成功,要么有人打败我们插入相同的节点(在这种情况下我们没有 - 它已经存在),或有人插入间隙(即现有的是NN+3 ,我们尝试了N+1 ,其他人成功了N+2 )在这种情况下我们重试直到我们成功或者找到其他人完成的“我们的”节点。

同步删除要困难得多; 查找RCU(读取 - 复制 - 更新)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM