Heim  >  Artikel  >  Backend-Entwicklung  >  Eine vorläufige Studie zum Multithreading-Mechanismus von C# (4)

Eine vorläufige Studie zum Multithreading-Mechanismus von C# (4)

黄舟
黄舟Original
2016-12-21 15:02:031099Durchsuche

exPRession stellt das Objekt dar, das Sie verfolgen möchten, normalerweise eine Objektreferenz. Wenn Sie eine Instanz einer Klasse schützen möchten, können Sie im Allgemeinen dies verwenden. Wenn Sie eine statische Variable (z. B. ein sich gegenseitig ausschließendes Codesegment innerhalb einer statischen Methode) schützen möchten, verwenden Sie im Allgemeinen den Klassennamen. Der Statement_Block ist der Code des sich gegenseitig ausschließenden Abschnitts. Dieser Code kann jeweils nur von einem Thread ausgeführt werden.

Das Folgende ist ein typisches Beispiel für die Verwendung des Schlüsselworts lock. Ich werde die Verwendung und den Zweck des Schlüsselworts lock in den Kommentaren erläutern:

//lock.cs
 using System; = new Random();
internal Account(int initial)

balance = initial;

 }  {
//Wenn der Saldo kleiner als 0 ist, eine Ausnahme auslösen
throw new Exception("Negative Balance");
 }
//Der folgende Code stellt sicher, dass der Wert von balance geändert wird, bevor der aktuelle Thread abgeschlossen ist
//Kein anderer Thread führt dies aus Code zum Ändern des Saldowerts
//Daher darf der Wert des Saldos nicht kleiner als 0 sein
sperre (dies)

{

 Console.WriteLine("Current Thread:"+Thread.CurrentThread.Name);
//Wenn kein Schutz des Sperrschlüsselworts besteht , kann ausgeführt werden nach: Nach der Beurteilung der Bedingung if
//Ein anderer Thread führte balance=balance-amount aus und änderte den Wert von balance
 //Und diese Änderung ist für diesen Thread unsichtbar, daher gilt die if-Bedingung zu diesem Zeitpunkt möglicherweise nicht mehr
//Dieser Thread führt jedoch weiterhin balance=balance-amount aus, also der Saldo kann kleiner als 0 sein
wenn (Saldo >= Betrag)
{
 Thread.Sleep(5 );
balance = Balance - Betrag; 🎜>else
return 0; // Transaktion abgelehnt  }
}
}
 internal void DoTransactions()
{  for (int i = 0; i < 100; i++)
Withdraw(r.Next( -50, 100));
}
}

interner Klassentest
{
statischer interner Thread[] threads = neuer Thread[10];
public static void Main()
{
Account acc = neues Konto (0); for (int i = 0; i < 10 ; i++)
{
Thread t = new Thread(new ThreadStart( acc.DoTransactions);
 threads[i] = t; i < 10; i++)
 threads[i].Name=i.ToString();
for (int i = 0; i < 10; i++)
threads[ i].Start();
Console.ReadLine();
} }

Wenn mehrere Threads ein Objekt gemeinsam nutzen, treten ähnliche Probleme wie im öffentlichen Code auf. Für diese Art von Problem sollte das Schlüsselwort lock nicht verwendet werden System.Threading kann als Monitor bezeichnet werden und bietet Threads die Möglichkeit, Ressourcen gemeinsam zu nutzen.

Die Monitor-Klasse kann ein Objekt sperren. Ein Thread kann das Objekt nur bearbeiten, wenn er die Sperre erhält. Der Objektsperrmechanismus stellt sicher, dass in Situationen, die zu Chaos führen können, jeweils nur ein Thread auf dieses Objekt zugreifen kann. Monitor muss einem bestimmten Objekt zugeordnet sein. Da es sich jedoch um eine statische Klasse handelt, kann er nicht zum Definieren von Objekten verwendet werden. Alle seine Methoden sind statisch und können nicht mithilfe von Objekten referenziert werden. Der folgende Code veranschaulicht die Verwendung von Monitor zum Sperren eines Objekts:


......
Queue oQueue=new Queue();
..... .
Monitor.Enter(oQueue);
......//Jetzt kann das oQueue-Objekt nur vom aktuellen Thread manipuliert werden
Monitor.Exit(oQueue); //Sperre freigeben

Wenn ein Thread wie oben gezeigt die Methode Monitor.Enter() aufruft, um ein Objekt zu sperren, gehört das Objekt ihm. Wenn andere Threads auf dieses Objekt zugreifen möchten, können sie nur darauf warten, dass es es verwendet Monitor.Exit()-Methode. Geben Sie die Sperre frei. Um sicherzustellen, dass der Thread die Sperre irgendwann aufhebt, können Sie die Methode Monitor.Exit() in den Final-Codeblock in der Struktur try-catch-finally schreiben. Für jedes vom Monitor gesperrte Objekt werden einige damit verbundene Informationen im Speicher gespeichert. Eine davon ist die Referenz des Threads, der derzeit die Sperre hält, und die andere ist eine Vorbereitungswarteschlange, in der die Objekte gespeichert werden, die zum Erwerb der Sperre bereit sind Der dritte Thread ist eine Warteschlange, die einen Verweis auf die Warteschlange enthält, die derzeit auf eine Änderung des Objektstatus wartet. Wenn der Thread, der die Objektsperre besitzt, bereit ist, die Sperre aufzuheben, verwendet er die Methode Monitor.Pulse(), um den ersten Thread in der Warteschlange zu benachrichtigen, sodass der Thread in die Vorbereitungswarteschlange übertragen wird, wenn die Objektsperre aufgehoben wird , in der Vorbereitungswarteschlange Der Thread kann die Objektsperre sofort erwerben.

Das Folgende ist ein Beispiel, das zeigt, wie das Schlüsselwort lock und die Monitor-Klasse verwendet werden, um Thread-Synchronisierung und -Kommunikation zu erreichen. Dies ist auch ein typisches Produzenten- und Verbraucherproblem. In dieser Routine wechseln sich der Producer-Thread und der Consumer-Thread ab. Der Producer schreibt eine Nummer, und der Consumer liest sie sofort und zeigt sie in den Kommentaren an. Der verwendete System-Namespace lautet wie folgt:

using System;
using System.Threading

Das Obige ist der Inhalt des Multithreading-Mechanismus von C# (4), mehr Für verwandte Inhalte achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn