Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 18751|Antwort: 0

[Tipps] C# Lesen/Schreiben Lock ReaderWriterLockSlim-Nutzung

[Link kopieren]
Veröffentlicht am 09.03.2017 16:59:19 | | | |
Das Konzept der Lese-Schreib-Sperren ist einfach und erlaubt es mehreren Threads, gleichzeitig Lese-Sperren zu erhalten, aber nur ein Thread darf gleichzeitig Schreib-Sperren erhalten, weshalb sie auch als geteilt-exklusive Sperren bezeichnet werden. In C# wird empfohlen, die ReaderWriterLockSlim-Klasse zu verwenden, um die Read/Write-Lock-Funktion abzuschließen.
In manchen Fällen ist die Anzahl der Lesungen an ein Objekt deutlich größer als die Anzahl der Modifikationen, und wenn es einfach durch Sperren gesperrt wird, wirkt sich das auf die Effizienz des Lesens aus. Wenn eine Lese-Schreib-Sperre verwendet wird, können mehrere Threads das Objekt gleichzeitig lesen, und es wird nur blockiert, wenn das Objekt vom Schreib-Lock belegt ist.
Einfach ausgedrückt: Wenn ein Thread in den Lesemodus wechselt, können andere Threads weiterhin in den Lesemodus wechseln; vorausgesetzt, ein Thread möchte zu diesem Zeitpunkt in den Schreibmodus wechseln, muss er blockiert werden. bis der Lesemodus ausgeht.
Ebenso werden die anderen Threads, wenn sie in den Schreibmodus gehen, blockiert, egal ob sie schreiben oder lesen wollen.
Es gibt zwei Möglichkeiten, in den Schreib-/Lesemodus zu gelangen:
EnterReadLock versucht, in den Schreibmodus-Lock-Zustand zu gelangen.
TryEnterReadLock(Int32) versucht, in den Lesemodus-Lock-Zustand zu gelangen, mit der Option, eine ganzzahlige Auszeit auszuwählen.
EnterWriteLock versucht, in den Write Mode Lock-Zustand einzutreten.
TryEnterWriteLock(Int32) versucht, in den Schreibmodus-Lock-Zustand zu gelangen, und die Timeout-Zeit kann ausgewählt werden.
Es gibt zwei Möglichkeiten, den Schreib-/Lesemodus zu verlassen:
ExitReadLock reduziert die rekursive Anzahl des Lesemodus und verlässt den Lesemodus, wenn die resultierende Zählung 0 (null) beträgt.
ExitWriteLock reduziert die rekursive Anzahl des Schreibmusters und verlässt den Schreibmodus, wenn die resultierende Anzahl 0 (null) beträgt.
So benutzt man es:



Man sieht, dass Thread 3 und Thread 4 gleichzeitig in den Lesemodus wechseln können, während Thread 5 nach 5 Sekunden in den Schreibmodus wechselt (also nachdem Thread 3 und 4 die Lesesperre verlassen haben).
Ändere den obigen Code, öffne zuerst 2 Threads im Schreibmodus und öffne dann Threads im Lesemodus, der Code ist wie folgt:
      


Die Ergebnisse sind wie folgt:

Wie du siehst, gehen Thread 3 und Thread 4 beide in den Schreibmodus, aber Thread 3 belegt zuerst die Schreibsperre, sodass Thread 4 10 Sekunden warten muss, bevor er eintritt. Die Threads 5 und 6 müssen die Lesesperre besetzen, also warte, bis Thread 4 die Schreibsperre verlässt, bevor du weitermachst.
TryEnterReadLock und TryEnterWriteLock können ein Timeout setzen; wenn man zu diesem Satz läuft, blockiert der Thread hier, wenn das Lock zu diesem Zeitpunkt besetzt werden kann, dann return true, wenn die Timeout-Zeit das Lock noch nicht besetzt hat, dann return false, gibt die Besetzung des Locks auf und führt den folgenden Code direkt aus.
EnterUpgradeReadLock
Die ReaderWriterLockSlim-Klasse bietet einen aufrüstbaren Lesemodus, der sich vom Lesemodus dadurch unterscheidet, dass sie auch durch Aufruf der Methoden EnterWriteLock oder TryEnterWriteLock in den Schreibmodus aufgerüstet werden kann. Weil immer nur ein Thread im aufrüstbaren Modus sein kann. Ein Thread, der in den Upgradable Mode wechselt, beeinflusst den Thread nicht im Lesemodus, das heißt, wenn ein Thread in den Upgradable Mode wechselt, können beliebig viele Threads gleichzeitig in den Lesemodus wechseln, ohne zu blockieren. Wenn mehrere Threads bereits darauf warten, eine Schreibsperre zu erhalten, blockiert das Ausführen von EnterUpgradeableReadLock, bis diese Threads ablaufen oder die Schreibsperre verlassen.
Der folgende Code zeigt, wie man im aufrüstbaren Lesemodus auf eine Schreibsperre upgraden kann.



Der Einfluss von Lese-/Schreibsperren auf die Leistung ist offensichtlich.
Folgender Testcode:


Der obige Code simuliert den Betrieb von 500 Aufgaben, von denen jeder einen Threadpool-Thread einnimmt, von denen 20 Schreibthreads und 480 Lesethreads simuliert werden. Es dauert 10 ms, um Daten zu lesen, und 100 ms, um die Sperrmethode bzw. die ReaderWriterLockSlim-Methode zu testen. Für ReaderWriterLockSlim kann eine Schätzung vorgenommen werden, dass 480 Threads gleichzeitig lesen, dann verbraucht es 10 ms, 20 Schreiboperationen nehmen 2000 ms ein, sodass die benötigte Zeit 2010 ms beträgt, und bei der gewöhnlichen Sperrmethode, da sie alle exklusiv sind, benötigen 480 Leseoperationen 4800 ms + 20 Schreiboperationen 2000 ms = 6800 ms. Die Ergebnisse zeigten eine deutliche Leistungssteigerung.






Vorhergehend:Visual Studio 2017 Offline-Installationspaket 18GB Baidu Cloud-Download
Nächster:Die neuesten Schwachstellen und Angriffsmethoden in den Struts2-Versionen 2.2 und 2.3
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com