Lock Free Deque,支持删除任意节点

时间:2009-11-29 05:12:03

标签: performance algorithm data-structures lock-free deque

这需要无锁,因为它必须在SMP系统的中断处理程序中运行。我不能拿锁。

我有一个连续的数组,包含一些值。这个数组中的一些条目是“免费的”,它们没有被占用。我想列出这些条目,以便我可以快速分配一个。但是,我偶尔会分配一个任意条目。

因此,我认为以下是一种很好的做事方式: 连续数组不仅包含值,还包含左右指针,因此产生双端队列。只有空闲值具有有效的左/右指针。我可以快速到达任意节点,因为它只是对deque的索引访问。

现在,问题的关键:是否有一个很好的无锁双解算法,它相对有效并且可以支持删除任意节点?

2 个答案:

答案 0 :(得分:2)

  

连续数组不仅包含值,还包含左右指针,从而制作   一个deque。

[剪断]

  

现在,问题的关键在于:是否存在一个相对较好的无锁双解算法   高效并且可以支持删除任意节点吗?

具有删除任意元素能力的双端队列实际上是一个双重链接列表;你唯一放弃的是能够插入任意元素并删除是困难的部分 - 如果你可以删除,你当然可以添加。

存在无锁双链表,但它需要垃圾收集。

这个怎么样;有一个自由主义者。这表示可用节点。节点实际上是一个数组,因此您可以将它们编入索引。当你必须使用一个任意节点时,索引到数组然后CAS中的那个元素中的一个标志但是将它留在空闲列表中(当然,你必须将它放在空闲列表的顶部)。当你将来弹出并且你发现你弹出一个已经被使用的元素时,只需保持弹出直到找到一个免费的元素。

答案 1 :(得分:0)

在垃圾收集系统中,如果您不关心物品的物理内存何时被释放,并且如果不可能,则可以使单个链接列表支持无锁逻辑删除项目在正在删除的项目后立即添加项目。为每个项目提供一个已删除的标志,并有一个列表遍历例程,当它访问每个项目时是否检查以下节点是否已被删除;如果有,请使用compare和swap来摆动当前节点的“下一个”指针。请注意,正在删除的节点的“下一个”指针可能会被更改,但只能跳过其后的节点。摆动下一个指针可能导致刚从列表中取消链接的节点重新链接(例如,如果B和C同时被移除,则A-> B-> C-> D可能变为A- > B-> D(摆动B s指针)然后A-> C-> D(摆动A的指针指向B的'下一个'指针的锁存值)。如果节点C曾经并且继续被标记为“已删除”,那么这应该不会造成问题,因为下次重复列表时,A的指针将摆动到D.

两个警告:-1-在非垃圾收集系统中,可能很难知道何时可以真正释放节点;释放节点然后将指针摆回到它可能会导致未定义的行为; -2-如果在删除的节点之后立即添加节点,则指针可以摆动以断开新节点。如果节点总是被添加到队列的末尾,那么可以通过使用虚拟节点结束队列来避免后一个问题,在节点之后有另一个节点之前不能删除它。