Heim >Backend-Entwicklung >C++ >Ist der Zugriff auf Variablen in Foreach-Schleifen innerhalb von C#-Lambda-Ausdrücken threadsicher?
C#-Lambda-Ausdrücke und foreach
Loop-Thread-Sicherheit
Dieser Artikel untersucht die Thread-Sicherheit des Zugriffs auf Variablen innerhalb von foreach
Schleifen innerhalb von C#-Lambda-Ausdrücken und konzentriert sich dabei auf die Unterschiede zwischen C#-Versionen.
Verhalten vor C# 5
In C#-Versionen vor 5 ist der direkte Zugriff auf Variablen, die außerhalb einer foreach
-Schleife innerhalb eines Lambda-Ausdrucks deklariert wurden, der in einem Multithread-Kontext verwendet wird (z. B. innerhalb eines Thread
-Konstruktors), unsicher. Dies liegt daran, dass die Iteratorvariable der foreach
-Schleife von allen Iterationen gemeinsam genutzt wird. Folglich könnten mehrere Threads auf dieselbe Variable zugreifen und diese ändern, was zu unvorhersehbaren und falschen Ergebnissen führen würde. Rennbedingungen sind sehr wahrscheinlich.
C# 5 und höher
Ab C# 5 verbessert die Verarbeitung von Iteratoren innerhalb von foreach
Schleifen durch den Compiler die Thread-Sicherheit erheblich. Der Compiler erstellt nun effektiv für jede Iteration eine neue Instanz der Iteratorvariablen. Dies bedeutet, dass jeder Lambda-Ausdruck eine eindeutige Kopie der Variablen erfasst, wodurch das Risiko von Race Conditions ausgeschlossen wird. Daher gelten in C# 5 und späteren Versionen beide Ansätze (Verwendung einer einzelnen Iteratorvariablen, die außerhalb oder innerhalb der Schleife deklariert wird) im Allgemeinen als Thread-sicher.
Anschauliches Beispiel (unsicheres Verhalten vor C#5)
Der folgende Codeausschnitt verdeutlicht das unsichere Verhalten in Versionen vor C#5:
<code class="language-csharp">static void Main() { int[] data = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; foreach (int i in data) { new Thread(() => Console.WriteLine(i)).Start(); } Console.ReadLine(); }</code>
Das Ausführen dieses Codes führt wahrscheinlich zu Ausgaben, bei denen die Werte von i
nicht sequentiell korrekt sind, was die Race-Bedingung verdeutlicht. Jeder Thread erfasst dieselbe i
-Variable, und ihr Wert kann sich ändern, bis ein Thread seinen Lambda-Ausdruck ausführen kann.
Fazit
Während ältere C#-Versionen eine sorgfältige Handhabung von Iteratorvariablen in foreach
-Schleifen innerhalb von Lambda-Ausdrücken erforderten, um Thread-Sicherheit zu gewährleisten, entschärfen C# 5 und spätere Versionen dieses Problem durch Compileroptimierungen. Es empfiehlt sich jedoch immer noch, potenzielle Parallelitätsprobleme im Auge zu behalten, insbesondere beim Umgang mit gemeinsam genutzten Ressourcen in Lambda-Ausdrücken, unabhängig von der C#-Version. Die Verwendung lokaler Variablen innerhalb jeder Iteration bleibt aus Gründen der Klarheit und Wartbarkeit eine bewährte Methode.
Das obige ist der detaillierte Inhalt vonIst der Zugriff auf Variablen in Foreach-Schleifen innerhalb von C#-Lambda-Ausdrücken threadsicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!