我有一个 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));
}
Writer看起来不完全一样,节点多,代码多,但问题如下:
锁定节点后,有时不会持有锁。我不明白为什么。有人解释一下。
*有时意味着我不知道它什么时候会发生。