我正在尝试编写一个无锁单链表。最终一致性不是问题(有人遍历可能包含不正确项目的列表)。
我认为我得到了正确的添加项目(循环和Interlocked.CompareExchange
)。
但是我不知道如何删除节点(列表中的任何位置),因为我必须获取上一个项目,并且他们将其Next
字段设置为当前节点Next
字段。
class Node
{
Node Next;
object Value;
}
class SinglyLinkedList
{
Root _root;
public void Add(object value)
{}
public void Remove(object value)
{}
}
IE
a -> b -> c
至
a -> c
伪代码:
Node prev;
Node node = _root;
while (node.Value != nodeValue)
{
prev = node;
node = node.Next;
}
prev.Next = node.Next;
我如何使它成为原子操作(即确保prev.Next = node.Next
没有 next 或 prev 被另一个线程删除的情况下调用它)?
我可以使用ReaderWriterLockSlim
改用,但我发现这个问题很有趣,因为我知道存在无锁链表。
我的担忧:
如果当前线程在循环和赋值之间挂起,可能会发生以下情况:
prev
本身可能已被另一个线程删除。node
可能已被另一个线程删除。Node.Next
可能已被删除