2010-04-30 63 views
3

所以我有一種情況,我可能有很多很多的讀取,只偶爾寫入到多個線程之間共享的資源。ReaderWriterLockSlim.EnterUpgradeableReadLock()與Monitor.Enter()基本相同嗎?

很久以前,我閱讀了關於ReaderWriterLock,並閱讀了有關ReaderWriterGate,它試圖減輕許多寫入王牌讀取並損害性能的問題。不過,現在我已經知道ReaderWriterLockSlim ...

從文檔中,我相信任何時候在「可升級模式」中只能有一個線程。在我使用的唯一訪問是EnterUpgradeableReadLock()(這適合於我的場景)的情況下,那麼和lock(){}堅持有什麼不同?

下面是摘錄:

試圖進入 升級模式區塊是否有 已經升級模式線程的線程, 如果有線程在等待進入 寫模式,或者如果有是寫模式下的單個線程 。

或者,遞歸策略對此有什麼影響?

+0

檢查這個答案。我在閱讀這篇文章時發現它很有用:http://stackoverflow.com/questions/2494104/readerwriterlockslim-question/2494179#2494179 – 2011-03-30 09:45:01

回答

4

同意。如果所有的線程需要獲取可升級的讀取鎖定您不能釋放讀取鎖定並獲取寫入鎖定,則ReaderWriterLockSlim對簡單排它鎖定沒有任何改進。遞歸不會改變這一點。 RWLS和避免永久存在的死鎖危險的需要大大有利於單線程寫入的模式。

1

我沒有所有的答案,但我給它一個鏡頭:

在C#中的lock語句是調用Monitor.Enter和Monitor.Exit語法糖。其效果是一次只有一個線程可以訪問鎖中的代碼。

lock() 
{ 
    //only one thread can access this code at a time 
} 

問題在於多個讀取無害,但lock()阻止無論如何。 ReaderWriterLockSlim允許多次讀取,只有一次寫入。這是一個提高效率的嘗試。

遞歸策略是您必須指定的內容 - 默認情況下它是關閉的。除此之外不瞭解的太多,但希望能有所幫助。