Tauchen Sie ein in das Innenleben der lock
-Aussage
Entwickler verwenden häufig die lock
-Anweisung, um die Codeausführung zu schützen, wenn sie mit nicht threadsicheren Objekten arbeiten. Aber was passiert genau unter der Haube, wenn mehrere Threads mit diesem geschützten Code interagieren?
Deep Dive: Verfolgung der Ausführung von lock
Anweisungen
In C# 3.0 wird die lock
-Anweisung in den folgenden Code übersetzt:
<code class="language-C#">var temp = obj; Monitor.Enter(temp); try { // 非线程安全代码 } finally { Monitor.Exit(temp); }</code>
In C# 4.0 wurde dieser Prozess geändert und der generierte Code lautet wie folgt:
<code class="language-C#">bool lockWasTaken = false; var temp = obj; try { Monitor.Enter(temp, ref lockWasTaken); // 非线程安全代码 } finally { if (lockWasTaken) { Monitor.Exit(temp); } }</code>
Monitor.Enter
Funktion
Monitor.Enter
spielt eine entscheidende Rolle für die Funktionalität der lock
-Anweisung. MSDN beschreibt seine Funktionsweise wie folgt:
" Verwenden Sie Enter
, um das Monitor
des als Argument übergebenen Objekts abzurufen. Wenn ein anderer Thread bereits ein Enter
für das Objekt ausgeführt hat, aber das entsprechende Exit
noch nicht ausgeführt hat, wird der aktuelle Thread blockiert bis ein anderer Der Thread gibt das Objekt frei ”
Im Wesentlichen garantiert Monitor.Enter
den exklusiven Zugriff auf das Objekt. Wenn ein anderer Thread versucht, dieselbe Sperre zu erhalten, wird er angehalten, bis die Sperre aufgehoben wird. Mehrere Aufrufe von Enter
aus demselben Thread führen nicht zu einer Blockierung, erfordern jedoch die gleiche Anzahl von Exit
-Aufrufen, um das Objekt zu entsperren und dem wartenden Thread die Fortsetzung der Ausführung zu ermöglichen.
Unendliche Wartezeit
Es ist erwähnenswert, dass Monitor.Enter
unbegrenzt darauf wartet, dass die Sperre verfügbar wird. Im Gegensatz zu einigen Sperrmechanismen wird kein Timeout erzwungen.
Das obige ist der detaillierte Inhalt vonWie funktioniert die C#-Anweisung „lock' unter der Haube?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!