我有一個AVL樹數據結構,其中每個節點都有自己的鎖。因爲有更多的作家試圖訪問一個節點。EnterWriteLock後不鎖定
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));
}
作家看起來不完全一樣,有更多節點和更多的代碼,但問題是以下幾點:
後鎖定節點,不鎖,有時。我不明白爲什麼。 有任何解釋。
*有時意味着我無法知道它何時會發生。
將此代碼複製並粘貼到項目中很明顯,它不像您的真實代碼。其中有許多錯誤會阻止它編譯,如果它們以明顯的方式修復,則不會拋出異常。請嘗試創建一個簡短但完整的* compilable *示例來演示問題。 (你可能在嘗試這樣做的時候自己發現解決方案) –
不,它不是一個真正的代碼,現在它是代碼,但是我仍然無法在這裏複製整個項目,因爲它太長了。這只是對問題的解釋。 – Dejvovo
您持有寫鎖,而不是讀鎖。將測試更改爲ww.IsWriteLockHeld –