Ich versuche, eine Sperre frei einzigen verknüpften Liste zu schreiben. Eventuelle Konsistenz ist kein Problem (jemand durchquert eine Liste, die falsche Elemente enthalten könnte).Versuchen, eine Lock-Free-Liste einfach verknüpft zu schreiben, Probleme mit der Entfernung
Ich denke, dass ich das Hinzufügen Element rechts (Schleifen und Interlocked.CompareExchange
).
Aber ich kann nicht herausfinden, wie Knoten (irgendwo in der Liste) entfernt werden, da ich das vorherige Element abrufen muss und sie sein Next
Feld auf dem aktuellen Knoten Next
Feld festlegen.
class Node
{
Node Next;
object Value;
}
class SinglyLinkedList
{
Root _root;
public void Add(object value)
{}
public void Remove(object value)
{}
}
dh
a -> b -> c
zu
a -> c
Pseudo-Code:
Node prev;
Node node = _root;
while (node.Value != nodeValue)
{
prev = node;
node = node.Next;
}
prev.Next = node.Next;
wie kann ich machen Dies ist eine atomare Operation (d.h. Stellen Sie sicher, dass prev.Next = node.Next
aufgerufen wird, ohne dass entweder next oder prev dazwischen von einem anderen Thread entfernt wird)?
Ich könnte stattdessen ReaderWriterLockSlim
verwenden, aber ich fand dieses Problem interessant, da ich weiß, dass es gibt frei verknüpfte Listen.
My betrifft:
Das Folgende passieren kann, wenn der aktuelle Thread zwischen der Schleife und der Zuordnung aufgehängt ist:
prev
selbst kann von einem anderen Thread entfernt wurden.node
wurde möglicherweise durch einen anderen Thread entfernt.Node.Next
könnte wurden entfernt
Haben Sie sich Interlocked.CompareExchange (http://msdn.microsoft.com/en-us/library/system.threading.interlocked.compareexchange%28v=vs.71%29.aspx) angesehen? Sie könnten prev mit node.next aktualisieren, wenn prev noch den ursprünglichen Wert hat. –
@JeffPaquette Nr. Sowohl "node.Next" als auch "prev.Next" können entweder durch 'Add()' oder eine andere Operation 'Remove()' geändert worden sein. So hilft nur der Vergleich "vorher" nicht. – jgauffin
Wenn Sie eine Lock-Free doppelt verkettete Liste benötigen, könnte ich Ihnen meine reine C# Implementierung basierend auf einem Papier von Sundell und Tsigas empfehlen. https://github.com/2i/LockFreeDublyLinkedList – ominug