Heim >Backend-Entwicklung >C++ >Ist der Zugriff auf Variablen in Foreach-Schleifen innerhalb von C#-Lambda-Ausdrücken threadsicher?

Ist der Zugriff auf Variablen in Foreach-Schleifen innerhalb von C#-Lambda-Ausdrücken threadsicher?

DDD
DDDOriginal
2025-01-22 07:11:08324Durchsuche

Is Accessing Variables in Foreach Loops Within C# Lambda Expressions Thread-Safe?

C#-Lambda-Ausdrücke und foreachLoop-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!

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