2009-11-08 10 views
7

Aufgrund von Leistungsproblemen habe ich ReaderWriterLock durch ReaderWriterLockSlim ersetzt. Ich habe Probleme, die durch einen Code verursacht wurden, der bei Verwendung einer RWL korrekt funktioniert hat.Ersetzen von ReaderWriterLock mit ReaderWriterLockSLim - Probleme

Wie Sie sehen können, manchmal MethodA (die eine Schreib Sperre erwirbt) ruft eine andere Methode (die eine lesen Sperre erwirbt). Die zweite Methode wird auch von verschiedenen Orten aufgerufen, so dass es nicht immer zu einer Blockierung kommt. Zuvor verursachte AcquiringRead Sperre dieses Problem nicht.

Gibt es eine Lösung, außer "if IsRWheld" zu platzieren?

Das Problem ist so etwas wie die:

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; 
    } 
} 

Antwort

8

Der Aufruf von MethodX von MethodA als rekursive Verwendung des Schlosses qualifiziert.
Siehe Erläuterungen zu den MSDN page für ReaderWriterLockSlim:

Standardmäßig werden neue Instanzen von ReaderWriterLockSlim mit erstellt die LockRecursionPolicy.NoRecursion Flagge und erlauben keine Rekursion. Diese Standardrichtlinie wird für alle Neuentwicklungen empfohlen, da die Rekursion unnötige Komplikationen mit sich bringt und Ihren Code anfälliger für Deadlocks macht. Um die Migration von bestehenden Projekten zu vereinfachen, die Monitor- oder ReaderWriterLock verwenden, können Sie die LockRecursionPolicy.SupportsRecursion Flag verwenden, um Instanzen von ReaderWriterLockSlim zu erstellen, die Rekursion ermöglichen.

4

Ein weiterer Punkt zu berücksichtigen, wenn ReaderWriterLock durch ReaderWriterLockSlim ersetzt ist, dass letztere Implementiert IDisposable.

Dies kann den Austausch komplex machen - da alle Typen, die eine ReaderWriterLockSlim besitzen, auch IDisposable sein müssen.

Verwandte Themen