ロックフリーの単方向リンクリストを作成しようとしています。結果整合性は問題ではありません (間違ったアイテムを含む可能性のあるリストをトラバースする人)。
アイテムを正しく追加できたと思います(ループとInterlocked.CompareExchange
)。
Next
しかし、前の項目を取得する必要があり、そのフィールドを現在のノードフィールドに設定する必要があるため、ノード (リスト内の任意の場所) を削除する方法がわかりませんNext
。
class Node
{
Node Next;
object Value;
}
class SinglyLinkedList
{
Root _root;
public void Add(object value)
{}
public void Remove(object value)
{}
}
すなわち
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
?
代わりに使用することもできますReaderWriterLockSlim
が、ロックのないリンクされたリストが存在することを知っているため、この問題は興味深いものでした。
私の懸念:
現在のスレッドがループと割り当ての間で中断されている場合、次のことが発生する可能性があります。
prev
それ自体が別のスレッドによって削除された可能性があります。node
他のスレッドで削除された可能性があります。Node.Next
削除されたかもしれません