すべてのノードが独自のロックを持つ AVL ツリー データ構造があります。ノードにアクセスしようとしているより多くのライターが存在するためです。
class Node
{
public ReaderWriterLockSlim ww;
// ...
public Node()
{
ww = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);
// ...
}
}
class AVL_tree
{
public Node root;
// ...
public void Write(int value)
{
root = new Node();
root.ww.EnterWriteLock();
if (!root.ww.IsWriteLockHeld) throw new Exception("Why?");
// ...
root.ww.ExitWriteLock();
}
}
各ライターは新しいスレッドで開始しています
class Program{
public static AVL_Tree data;
static void Main()
{
data = new AVL_Tree();
List<Thread> vlakna = new List<Thread>();
for (int i = 1; i < 10; i++)
vlakna.Add(new Thread(Write));
foreach (Thread vlakno in vlakna)
vlakno.Start();
}
public static void Write() // Write some random data into the tree
{
Random rnd = new Random(DateTime.Now.Millisecond);
data.Writer(rnd.Next(1, 999));
}
ライターはこのようには見えません。より多くのノードとより多くのコードがありますが、問題は次のとおりです。
ノードをロックした後、ロックが保持されないことがあります。理由がわかりません。誰か何らかの説明をしてください。
※いつになるか分からない場合もございます。