2010-12-03 3 views
4

In der Warteschlange, Enqueue und Dequeue beide benötigen eine Schreibsperre. Warum sollte jemand ReaderWriterLockSlim verwenden anstatt nur die Sperre {}? Als BeispielSperrmechanismus für die Warteschlange <T> während der Warteschleife und aus der Warteschlange

ReaderWriterLockSlim Mit

qLock.EnterWriteLock(); 
try 
{ 
    localQ.Enqueue(item); // or localQ.Dequeue(item) 
} 

finally 
{ 
    qLock.ExitWriteLock(); 
} 

Versus Sperre {}

try 
{ 
    lock(qLock) { localQ.Enqueue(item);} // or localQ.Dequeue(item) 
} 
+1

@Davita, Brians Antwort ist in diesem Fall falsch (aber normalerweise wahr). Es ist bedauerlich, dass es 3 Stimmen hat. –

+0

danke an alle Antwort. Leider glaube ich nicht, dass ich meine Antwort schon habe. Ich bekomme den Peek() -Teil mit EnterReadLock(), aber wenn meine Logik nur Enqueue() und Dequeue() ist, brauche ich unabhängig von EnterWriterLock(). Wenn ich in einer Schleuse bin {} und sage, dass die Anschaffung sich auf unbestimmte Zeit verzögert oder sehr lang ist; Sperre bietet keine Fehlertoleranz und es ist möglich, in Deadlock oder ein Blockierungsszenario zu gelangen. Wäre nicht ReaderWriterLock oder ReaderWriterLockSlim bieten mir eine Fehlertoleranz-Option, um die Deadlock oder lange Blockierung zu vermeiden. Gedanken? oder bin ich hier weg vom Kurs – G33kKahuna

Antwort

2

In diesem Fall wird ReaderWriterLockSlim keinen wirklichen Vorteil bieten. Sie haben Recht, dass sowohl Enqueue als auch Dequeue Schreiboperationen sind und eine exklusive Schreibsperre erfordern würden.

Für eine Sammlung, die lesen Operationen, wie die meisten Sammlungen tun, wäre ReaderWriterLockSlim besser als immer mit lock.

Der einzige kleine Vorteil, an den ich denken könnte, ist Konsistenz. Wenn an den meisten Stellen ReaderWriterLockSlim verwendet wird, weil die meisten anderen Sammlungen für viele Lesevorgänge und wenige Schreibvorgänge verwendet werden, kann es für die Entwicklung und Wartung einfacher sein, einfach ReaderWriterLockSlim überall zu verwenden.

5

Die Verwendung von ReaderWriterLockSlim ist hauptsächlich eine Leistungsoptimierung in Szenarien, in denen viele Threads häufig von einer Ressource lesen, aber nur wenige Threads, die darauf schreiben.

Die Monitor-Klasse (die von der Lock-Anweisung verwendet wird) erwirbt eine exklusive Sperre für die Ressource - was bedeutet, dass sowohl Leser als auch Writer blockiert sind. In vielen Fällen ist Lesen jedoch viel häufiger als Schreiben. In diesen Szenarios ermöglicht die Verwendung einer Lese-/Schreibsperre mehreren Lesern das gleichzeitige Eingeben der Sperren, aber immer nur eines Schreibers (wenn alle Warteschlangenleser ausgeschaltet sind).

In Ihrem Beispiel die ein Leser/Schreiber-Sperre macht nur Sinn, wenn es andere Code, ohne dequeing ein Element ... sonst alle Operationen mutieren schreibt, und eine lock Aussage wäre besser geeignet, an der Warteschlange späht .

3

Nun, das würde Leser immer noch zu Peek ohne einen Schreibvorgang lock erlauben. Es ist schwer vorstellbar, ein Szenario, in dem dies praktisch sinnvoll ist.

Verwandte Themen