2009-11-08 4 views
7

En raison de problèmes de performances, j'ai remplacé ReaderWriterLock par ReaderWriterLockSlim. Je rencontre des problèmes, causés par du code qui fonctionnait correctement quand il utilisait un RWL.Remplacement de ReaderWriterLock avec ReaderWriterLockSLim - Problèmes

Comme vous pouvez le voir, parfois MethodA (qui acquiert une écriture verrouillage) appelle une autre méthode (qui un verrou lecture). La deuxième méthode est également appelée à partir de différents endroits, donc il n'y a pas toujours de collision de verrouillage. Auparavant, le verrouillage AcquiringRead ne provoque pas ce problème.

Existe-t-il une solution autre que de placer "si IsRWheld"?

Le problème est quelque chose comme ça:

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

Répondre

8

L'appel à MethodX de METHODA qualifie comme l'utilisation récursive de la serrure.
Voir les remarques sur la MSDN page pour ReaderWriterLockSlim:

Par défaut, les nouvelles instances de ReaderWriterLockSlim sont créés avec le LockRecursionPolicy.NoRecursion drapeau et ne permettent pas récursivité. Cette politique par défaut est recommandée pour tous les nouveaux développements , car la récursivité introduit des complications inutiles et rend votre code plus enclin à deadlocks. Pour simplifier la migration des projets existants qui utilisent Moniteur ou ReaderWriterLock, vous pouvez utiliser le LockRecursionPolicy.SupportsRecursion drapeau pour créer des instances de ReaderWriterLockSlim qui permettent récursion .

4

Un autre point à considérer lors du remplacement ReaderWriterLock par ReaderWriterLockSlim est que ce dernier met en œuvre IDisposable.

Cela peut rendre le complexe de remplacement - comme tous les types qui possèdent un ReaderWriterLockSlim doit également être IDisposable.

Questions connexes