Ich versuche vollständig zu verstehen, wie das Erstellen separater Threads, die die gleiche Methode einer Klasseninstanz aufrufen, lokale Variablen in der Methode beeinflussen kann.Multi Threading freigegebene lokale Variablen
Zum Beispiel habe ich eine Klasse mit einer einzigen Methode (Teilen)
public class Maths
{
public int Num1;
public int Num2;
public void Divide()
{
for (long i = 0; i < 100000; i++)
{
Num1 = 2;
Num2 = 2;
int result = Num1/Num2;
Num1 = 0;
Num2 = 0;
}
}
}
zwei Threads instanziiert und die Kluft Methode wie folgt aufgerufen:
static void Main(string[] args)
{
Maths m = new Maths();
Task t1 = new Task(() => m.Divide());
Task t2 = new Task(() => m.Divide());
List<Task> tl = new List<Task> { t1, t2 };
Parallel.ForEach(tl, task => task.Start());
Console.ReadLine();
}
}
Manchmal dieser Code ok läuft. Aber zu anderen Zeiten wird ein divebyzero-Fehler in der Zeile ausgegeben:
int result = Num1/Num2;
Meine Annahme ist, dass einer der Threads die Num1 und Num2 auf Null zurücksetzt, kurz bevor der andere Thread die Num1/Num2 aufruft. Daher verursacht eine Division durch Null Ausnahme.
Das würde Sinn machen und ich sollte eine Sperre verwenden, aber ich verstehe nicht, wie diese lokalen Variablen Num1 und Num2 zwischen den Threads geteilt werden, da mein Verständnis war, dass lokale Variablen nicht zwischen Threads geteilt werden?
Danke, das macht jetzt Sinn. – selams