Unter normalen Umständen steigt die Komplexität des Programms erheblich, die Leistung sinkt erheblich und die Fehlerwahrscheinlichkeit steigt erheblich.
Multithreaded-Programmierung ist dazu gedacht, ein Programm parallel auszuführen, um die Datenverarbeitungsfähigkeiten zu verbessern, aber in den meisten Fällen gibt es einen Wettbewerb um gemeinsame Ressourcen, weshalb es beim Ändern von Ressourcenobjekten gesperrt werden muss. Es gibt jedoch viele Möglichkeiten, Sperren zu implementieren, daher werfen wir einen Blick auf die Implementierung und Leistung mehrerer Arten von Sperren in C#.
Verschiedene Möglichkeiten, Schlösser zu nutzen
1. Atomsperre
Erreichen Sie "lockless" Wettbewerb durch die atomare Operation Interlocked.CompareExchange.
Die offizielle Erklärung ist, atomare Operationen für Variablen bereitzustellen, die von mehreren Threads geteilt werden. Namensraum: System.Threading
2. Kritischer Bereich
Die Serialisierung mehrerer Threads zum Zugriff auf öffentliche Ressourcen oder einen Codeabschnitt ist schnell und eignet sich für die Steuerung des Datenzugriffs. Die Sperrsyntax in C# ist ein Syntaxzucker für den kritischen Bereich (Monitor).
3. Atomare Operation
Atomare Operationen, die ein Spezialfall sind, sind von Natur aus threadsicher, sodass sie nicht gesperrt werden müssen.
Offiziell interpretiert als Erhöhung des Wertes einer gegebenen Variablen in Form einer atomaren Operation und Speicherung des Ergebnisses. Namensraum: System.Threading
4. Lesen und Schließen schreiben
Lese-Schreib-Sperren ermöglichen das Lesen von Ressourcen, wenn andere Programme schreiben, daher ist dies angemessener, wenn die Ressource Dirty Reads erlaubt.
Die offizielle Erklärung nennt einen gesperrten Zustand, der zur Verwaltung des Ressourcenzugriffs verwendet wird und Multithread-Lesevorgänge oder exklusiven Schreibzugriff ermöglicht. Der Namensraum ist System.Threading
5. Semaphor
Semaphore, die zur Steuerung einer begrenzten Anzahl von Benutzerressourcen entwickelt wurden.
Die offizielle Erklärung begrenzt die Anzahl der Threads, die gleichzeitig auf eine Ressource oder einen Ressourcenpool zugreifen können. Der Namensraum ist System.Threading
6. Ereignisse
Wird verwendet, um den Thread zu benachrichtigen, dass einige Ereignisse eingetreten sind, was den Beginn einer Nachfolgeaufgabe startet.
Die offizielle Erklärung besagt, dass Thread-Synchronisationsereignisse automatisch zurückgesetzt werden, wenn ein Signal nach der Freigabe eines Threads empfangen wird. Solche Typen können nicht vererbt werden.
7. Gegenseitiger Ausschluss
Es gibt eine Mutex-Klasse in C#, direkt unter dem System-Threading-Namensraum, Mutex ist tatsächlich ein Mutex, das nicht nur den Ressourcenwettbewerb zwischen mehreren Threads bewältigen kann, sondern auch den Ressourcenwettbewerb zwischen Prozessen.
Leistungstestcode
Führe den Code aus
Ergebnisse des Leistungstests
Hinweis: Die oben genannten Daten sind nur das Ergebnis der Hardwareleistung der aktuellen Testumgebung und können nur miteinander verglichen werden.
1) In verschiedenen Tests ist es definitiv am schnellsten, um nicht zu sperren, also versuchen Sie, den Ressourcenwettbewerb zu vermeiden, der zu einem gesperrten Betrieb führt.
2) Interlocked. CompareExchange zeigt durchweg eine überlegene Leistung im Multithreading und belegt den zweiten Platz.
3) Die dritte Sperre, die kritische Zone, zeigt ebenfalls gute Leistung, daher widerlegen Sie bitte andere, wenn sie sagen, die Sperrleistung sei niedrig.
4) Der vierte Platz ist die atomare Variable (atomare) Operation, die derzeit jedoch nur das Selbstvergrößern und Subtraktieren von Variablen unterstützt, und die Anwendbarkeit ist nicht stark.
5) Die Leistung des fünften Lese-/Schreib-Schlosses (ReaderWriterLockSlim) ist ebenfalls in Ordnung, es unterstützt Nichtslesen, und die Praktikabilität ist immer noch relativ gut.
6) Die übrigen Semaphore, Events und Mutex haben die schlechteste Leistung, natürlich haben sie ihren eigenen Anwendungsbereich, aber sie sind im Umgang mit Ressourcenkonkurrenz nicht gut.
Ursprüngliche Linkadresse:Der Hyperlink-Login ist sichtbar.
|