Ich versuche, einen Fehler zu finden, der mit den Multithreading-Anwendungen in Verbindung stehen könnte. Ich habe den Code vereinfacht:Sperr- und Ref-Werte von externer Funktion
class Outer {
private static int count;
//this function is called from multiple threads in quick succession
public void DoFoo() {
Inner.Increment(ref count);
}
}
class Inner {
private readonly static object mLock = new object();
public static string Increment(ref count) {
lock (mLock) (
if (count > 1000)
count = 0;
count++;
}
return count.ToString();
}
}
Kann die Verriegelung garantieren die Sicherheit einer Variablen auf diese Weise weitergegeben? Gibt es irgendwelche Kopien der Zählung, die nicht offensichtlich sind und die Speichersicherheit beeinträchtigen könnten? Ich dachte, es könnte einen neuen int zurückgeben und die Zuweisung am Ende der Methode oder so machen. Abgesehen davon verstehe ich, dass der Sperrbereich alle Caching-Probleme behandeln würde.
Der Fehler, der das Problem unserer Aufmerksamkeit erregte, war scheinbar einer der Threads mit einer veralteten Version von count.
Das war, was ich dachte, aber würde es den neuesten Wert erhalten, wenn die Lock-Anweisung eingegeben wird (weil es eine Referenz ist) oder wird es mit dem veralteten Wert bleiben? – flukus
@flukus Schau dir meinen modifizierten Code an. – xanatos
Wird das Problem lösen, dass der veraltete Wert von extern weitergegeben wird? – flukus