C 单链表插入同步

C 单链表插入同步,c,synchronization,sorted,singly-linked-list,C,Synchronization,Sorted,Singly Linked List,假设我有一个由N个整数组成的排序单链表,其中不包含重复项,还有k个线程(其中k首先,如果插入到集合中不是一个非常罕见的任务,那么链表并不是一个很好的解决方案,因为找到插入点是一个O(N)操作,即使对于已排序的列表也是如此,因此最终会严重扩展 如果您仍然需要执行此操作,则可以将插入(与删除不同)作为无锁操作执行到排序列表中,但要小心: 查找插入点,cur 创建新节点(将上一个/下一个链接分配给cur/cur->next) 原子操作:比较_和_交换(cur->next,new,new->next);

假设我有一个由N个整数组成的排序单链表,其中不包含重复项,还有k个线程(其中k首先,如果插入到集合中不是一个非常罕见的任务,那么链表并不是一个很好的解决方案,因为找到插入点是一个
O(N)
操作,即使对于已排序的列表也是如此,因此最终会严重扩展

如果您仍然需要执行此操作,则可以将插入(与删除不同)作为无锁操作执行到排序列表中,但要小心:

  • 查找插入点,
    cur
  • 创建新节点(将上一个/下一个链接分配给
    cur
    /
    cur->next
  • 原子操作:
    比较_和_交换(cur->next,new,new->next);

    如果失败:
    If(new->value==next->value)return;//有人击败了我们

    其他:
    cur=cur->next
    并重复舞蹈(列表已排序,有人在我们前面插入)
  • 也就是说,尝试在中链接新节点的结果要么是我们成功了,要么是有人抢先插入了相同的节点(在这种情况下,我们没问题——它已经存在了),要么是有人插入了一个缺口(即现有的是
    N
    N+3
    ,我们尝试了
    N+1
    ,其他人成功了
    N+2
    )在这种情况下,我们会重试,直到成功或发现其他人完成了“我们的”节点


    同步删除要困难得多;为此查找RCU(阅读副本更新)。

    作业?面试问题?你自己做了什么来尝试回答这个问题?这与C有什么关系?我正在做一个个人项目,我目前面临的问题(更复杂)减少到我上面所问的。我正在尝试使用C中的pthreads实现解决方案,这就是我添加C标记的原因。我是否应该提供更多的实现细节?这样定位插入点是否会导致读写器问题?即,如果前面的列表不正确,我们无法搜索或找到插入点curr正在修改。您正在测试“早于”,并且该点不会因插入而更改(注意:我不是说修改,因为这将包括删除)。在“原子舞蹈”中如果另一个插入器与您竞争,您可能必须提前插入点,但您永远不需要后退。@FrankH。我不明白为什么compareAndSwap有三个参数。在Java中,它将是(oldObject,newObject),这里的第三个参数是什么?