2009-11-08 25 views
7

パフォーマンス上の問題により、ReaderWriterLockReaderWriterLockSlimに置き換えました。 RWLを使用しているときに正しく機能していたコードが原因で、問題が発生しています。ReaderWriterLockをReaderWriterLockSLimに置き換える - 問題

あなたが見ることができるように、時にはMethodAは(書き込みロックを取得する)(ロックを読んを取得)別のメソッドを呼び出します。 2番目の方法は、別の場所から呼び出されるため、必ずしもロックの衝突があるとは限りません。これまでは、AcquiringReadロックで問題が発生していませんでした。

"if IsRWheld"を配置する以外の解決策はありますか? MethodAからMethodXへの呼び出しは、ロックの再帰的な使用としてそれを修飾する

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

問題は、そのようなものです。デフォルトでは

は、 ReaderWriterLockSlimの新しいインスタンスが LockRecursionPolicy.NoRecursion フラグを使用して作成され、再帰を許可しない:
はReaderWriterLockSlimのためMSDN page上の発言を参照してください。この デフォルトポリシーは、再帰 が不必要な複雑さを導入して を導入し、コードが デッドロックになりやすいため、すべてのユーザーにとって、新しい開発にお勧めします。 新規開発。モニターや ReaderWriterLockを使用 既存のプロジェクトからの移行を簡素化するために、あなたは 再帰を許可する ReaderWriterLockSlimのインスタンスを作成するために LockRecursionPolicy.SupportsRecursion フラグを使用することができます。

4

ReaderWriterLockSlimによってReaderWriterLockを交換する際に考慮すべきもう一つの点は、後者の実装IDisposableあります。

これは、代替複合体を作成することができます。ReaderWriterLockSlimを所有する任意のタイプもIDisposableである必要があります。

関連する問題