Ich habe eine Frage zum C# -Memory-Modell und den Threads. Ich bin mir nicht sicher, ob der folgende Code ohne das flüchtige Schlüsselwort korrekt ist.C# -Memory-Modell und nichtflüchtige Variable, die vor der Erstellung der anderen Threads initialisiert wurde
public class A {
private int variableA = 0;
public A() {
variableA = 1;
Thread B = new Thread(new ThreadStart(() => printA())).Start();
}
private void printA() {
System.Console.WriteLine(variableA);
}
}
Meine Sorge ist, wenn sichergestellt ist, dass das Thema B VariableA mit dem Wert 1 ohne Verwendung flüchtige sehen? Im Hauptthread weise ich der VariableA im Konstruktor nur 1 zu. Danach werde ich VariableA nicht berühren, es wird nur in Thread B verwendet, also ist das Sperren wahrscheinlich nicht notwendig.
Aber ist es garantiert, dass der Haupt-Thread seinen Cache leeren und den Inhalt von VariableA in den Hauptspeicher schreiben wird, damit der zweite Thread den neu zugewiesenen Wert lesen kann?
Ist es außerdem garantiert, dass der zweite Thread den Inhalt von VariableA aus dem Hauptspeicher liest? Können einige Compileroptimierungen auftreten und der Thread B kann den Inhalt der Variable A aus dem Cache anstelle des Hauptspeichers lesen? Es kann passieren, wenn die Reihenfolge der Anweisungen geändert wird.
Sicherlich wird das Hinzufügen des flüchtigen der VariableA-Deklaration den Code korrekt machen. Aber, ist es notwendig? Ich frage, weil ich einige Code mit einigen nicht flüchtigen Variablen Initialisierung im Konstruktor geschrieben hat, und die Variablen später von einigen Timer-Threads verwendet werden, und ich bin mir nicht sicher, ob es völlig korrekt ist.
Was ist mit dem gleichen Code in Java?
Danke, Michal
Yeh, ich vermute das gleiche, aber ich will sicher sein. Ich werde ihm eine E-Mail schicken, danke. –