2013-02-11 23 views
4

關於ReaderWriterLockSlimReaderWriterLockSlim:一個可升級的鎖之後獲取讀鎖不會拋出LockRecursionException

獲取兩個鎖隨後相同線程內實際上應該拋出一個LockRecursionException(遞歸策略設置爲NoRecursion) 。

我的觀察結果:

  • 讀者鎖,然後讀者鎖 - >LockRecursionException
  • 讀者鎖,然後升級的讀者鎖 - >LockRecursionException
  • 讀者鎖,然後作家鎖 - >LockRecursionException
  • 升級讀者鎖,然後讀者鎖 - >也不例外
  • 升級讀者鎖,然後升級讀者鎖 - >LockRecursionException
  • 可升級讀卡器鎖,然後寫卡器鎖 - >也不例外
  • 作家鎖,然後讀者鎖 - >LockRecursionException
  • 作家鎖,然後升級讀者鎖 - >LockRecursionException
  • 作家鎖,然後作家鎖 - >LockRecursionException

此行爲是否正確?

回答

4

From the docs

在升級模式中的螺紋可以降級通過首先調用EnterReadLock方法,然後調用ExitUpgradeableReadLock方法來讀取模式。所有鎖定遞歸策略都允許使用此降級模式,即使是NoRecursion也是如此。

我的理解是,對於寫作的情況下,進入一個寫鎖是從升級移動這麼寫模式的正常方式,所以必須要下NoRecursion政策甚至支持(有似乎小指向不可升級的可升級鎖:)

+1

是的,這也是我的理解。這兩條路徑是正常的升級和降級場景。因此無論遞歸策略如何,都必須允許它們。我的困惑至少部分來自於我從來沒有把它想象成_downgradeable_lock這個事實。 – 2013-02-11 12:23:33

+0

@JohnSloper不,我沒有意識到它也可以降級。方便,但如果一個線程可以確定它不再需要寫入。 – shambulator 2013-02-11 12:25:01

相關問題