2009-11-08 23 views
7

由於性能問題,我用ReaderWriterLockSlim替換ReaderWriterLock。我遇到了麻煩,這是由使用RWL時正確運行的代碼引起的。用ReaderWriterLockSLim替換ReaderWriterLock - 問題

正如你所看到的,有時MethodA(其中取得鎖)調用另一個方法(它取得鎖)。第二種方法也是從不同的地方調用的,所以並不總是存在鎖相碰撞。以前,AcquiringRead鎖不會導致該問題。

是否有任何解決方案,除了放置「如果IsRWheld」?

的問題是類似的東西:

class Avacado 
{ 
    ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(); 

    void MethodA() 
    { 
     _lock.TryEnterWriteLock(-1); 
     LockedList.Add(someItem) 
     var result = MethodX(); 
     _lock.ExitWriteLock(); 
    } 

    object MethodX() 
    { 
     //if called from MethodA, it will throw an exception 
     _lock.TryEnterReadLock(-1); 

     //...some stuff with LockedList... 
     var result = LockList.Something(); 

     _lock.ExitReadLock(); 

     return result; 
    } 
} 

回答

8

從治法,以MethodX調用使其適合作爲遞歸使用的鎖。
見關於MSDN page對ReaderWriterLockSlim的言論:

缺省情況下, ReaderWriterLockSlim新實例與 的LockRecursionPolicy.NoRecursion 標誌創建並不允許遞歸。因爲遞歸 引入了不必要的複雜因素 並且使您的代碼更容易發生 死鎖,所以建議對所有 默認策略使用默認策略。要使用監視器或 ReaderWriterLock 現有項目簡化遷移,您可以使用 LockRecursionPolicy.SupportsRecursion 標誌,以創建允許 遞歸 ReaderWriterLockSlim的實例。

4

ReaderWriterLock替換爲ReaderWriterLockSlim時需要考慮的另一點是後者實現IDisposable

這可以使替換複雜 - 因爲任何類型擁有ReaderWriterLockSlim也必須是IDisposable