单链表插入同步

时间:2011-02-28 11:24:57

标签: c synchronization sorted singly-linked-list

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

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

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

1 个答案:

答案 0 :(得分:3)

首先,如果插入到集合中的任务非常罕见,那么链接列表不是一个很好的解决方案 - 因为查找插入点是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
    否则:cur = cur->next并重复舞蹈(列表已排序,有人插在我们面前)
  4. 即。尝试链接新节点的结果要么是我们成功了,要么是有人打败我们插入同一个节点(在这种情况下我们没关系 - 它已经存在),或者有人插入了一个空白(即存在是NN+3,我们尝试N+1,其他人成功N+2)在这种情况下,我们会重试,直到我们成功或找到其他人完成“我们的”节点。< / p>

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