var a string var done bool func setup() { a = "hello, world" done = true } func doprint() { if !done { once.Do(setup) } print(a) } func twoprint() { go doprint() go doprint() }
Variablen:
Funktionen:
Parallelität in main():
Potenzielle Probleme:
Mögliche Ergebnisse
Aufgrund der fehlenden Synchronisierung ist die Ausgabe des Programms nicht deterministisch. Hier sind die möglichen Szenarien:
Fall 1: g() wird ausgeführt, bevor f() a und b ändert:
0 0
oder
FALL 2: Wenn b = 2 vor g() abgeschlossen ist, a = 1 jedoch nicht, könnte die Ausgabe wie folgt lauten:
2 0
Wichtige Beobachtungen
Datenwettlauf: Der gleichzeitige Zugriff auf a und b ohne Synchronisierung führt zu einem Datenwettlauf. Dies macht das Verhalten des Programms undefiniert und unvorhersehbar
Den Code korrigieren
var a, b int var wg sync.WaitGroup func f() { a = 1 b = 2 wg.Done() } func g() { print(b) print(a) } func main() { wg.Add(1) go f() wg.Wait() g() }
var a, b int func f(done chan bool) { a = 1 b = 2 done <- true } func g() { print(b) print(a) } func main() { done := make(chan bool) go f(done) <-done g() }
Hier wartet g(), bis f() ein Signal über den Fertig-Kanal sendet.
Das obige ist der detaillierte Inhalt vonGO: Fehlende Synchronisierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!