Heim > Artikel > Backend-Entwicklung > Eine vorläufige Studie zum Multithreading-Mechanismus von C# (3)
Was wir hier beachten sollten, ist, dass andere Threads an den Thread angehängt sind, in dem sich die Main()-Funktion befindet. Der Start-Thread kann als Haupt-Thread bezeichnet werden Alle Vordergrund-Threads werden gestoppt, dann kann der Haupt-Thread beendet werden und alle Hintergrund-Threads werden bedingungslos beendet. Obwohl aus der Mikroperspektive alle Threads seriell ausgeführt werden, können Sie sich aus der Makroperspektive eine parallele Ausführung vorstellen.
Leser müssen die Eigenschaft Thread.ThreadState bemerkt haben. Sie stellt unter verschiedenen Umständen unterschiedliche Werte dar, sodass wir manchmal den Programmablauf beurteilen können . Die möglichen Werte von ThreadState in verschiedenen Situationen sind wie folgt:
Aborted: Der Thread wurde gestoppt
AbortRequested: Die Thread.Abort()-Methode des Threads wurde aufgerufen, aber der Thread wurde noch nicht gestoppt
Hintergrund: Der Thread wird im Hintergrund ausgeführt, bezogen auf die Eigenschaft Thread.IsBackground
Läuft: Der Thread wird normal ausgeführt
Gestoppt: Der Thread wurde gestoppt
StoPRequested: Der Thread wird dazu aufgefordert stop
Suspended: Der Thread wurde angehalten (In diesem Zustand können Sie ihn erneut ausführen, indem Sie die Resume()-Methode aufrufen)
SuspendRequested: Der Thread fordert an, angehalten zu werden, aber es wird in Zukunft keine Antwort geben
Nicht gestartet: Thread.Start() wird nicht aufgerufen, um die Ausführung des Threads zu starten
WaitSleepJoin: Der Thread befindet sich aufgrund aufrufender Methoden wie Wait(), Sleep() oder Join() in einem blockierten Zustand
Der oben erwähnte Hintergrundstatus zeigt an, dass der Thread im Hintergrund läuft. Was ist also das Besondere an dem Thread, der im Hintergrund läuft? Wo ist der Ort? Tatsächlich gibt es nur einen Unterschied zwischen Hintergrund-Threads und Vordergrund-Threads: Hintergrund-Threads verhindern nicht die Beendigung des Programms. Sobald alle Vordergrund-Threads eines Prozesses beendet wurden, beendet die CLR (Common Language Runtime Environment) den Prozess vollständig, indem sie die Abort()-Methode eines beliebigen überlebenden Hintergrundprozesses aufruft.
Wenn Threads um CPU-Zeit konkurrieren, stellt die CPU Dienste entsprechend der Priorität des Threads bereit. In C#-Anwendungen können Benutzer fünf verschiedene Prioritäten festlegen, nämlich „Highest“, „AboveNormal“, „BelowNormal“ und „Niedrigste“. Wenn die Priorität beim Erstellen eines Threads nicht angegeben wird, verwendet das System standardmäßig „ThreadPriority.Normal“. Um einem Thread
eine Priorität zuzuweisen, können wir den folgenden Code verwenden:
//Setze die Priorität auf die niedrigste
myThread.Priority=ThreadPriority.Lowest;
Durch Festlegen der Priorität des Threads können wir dafür sorgen, dass einige relativ wichtige Threads zuerst ausgeführt werden, z. B. die Beantwortung von Benutzern usw.
Da wir nun ein vorläufiges Verständnis dafür haben, wie ein Thread erstellt und gesteuert wird, werden wir uns mit den typischeren Problemen bei der Thread-Implementierung befassen und ihre Lösungen erkunden.
3. Thread-Synchronisation und Kommunikation – Produzenten und Konsumenten
Nehmen wir eine Situation an, in der zwei Threads gleichzeitig Elemente zur Warteschlange hinzufügen Nimmt Elemente aus der Warteschlange, dann nennen wir den Thread, der das Element hinzufügt, einen Produzenten und den Thread, der das Element aufnimmt, einen Verbraucher. Das Producer-Consumer-Problem scheint einfach, aber es ist ein Problem, das in Multithread-Anwendungen gelöst werden muss. Es beinhaltet Synchronisations- und Kommunikationsprobleme zwischen Threads.
Wie bereits erwähnt, verfügt jeder Thread über seine eigenen Ressourcen, der Codebereich wird jedoch gemeinsam genutzt, dh jeder Thread kann dieselbe Funktion ausführen. In einer Multithread-Umgebung besteht jedoch ein mögliches Problem darin, dass mehrere Threads eine Funktion gleichzeitig ausführen, was zu Datenverwirrung und unvorhersehbaren Ergebnissen führt. Daher müssen wir diese Situation vermeiden. C# bietet eine Schlüsselwortsperre, die einen Codeabschnitt als kritischen Abschnitt definieren kann. Der sich gegenseitig ausschließende Abschnitt ermöglicht jeweils nur die Ausführung eines Threads, während andere Threads warten müssen. In C# ist das Schlüsselwort lock wie folgt definiert:
lock(expression) Statement_block
Das Obige ist der Inhalt der vorläufigen Untersuchung des Multithreading-Mechanismus von C# (3). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!