Heim >Backend-Entwicklung >Golang >Wirkt WaitGroup.Wait() in Go als Speicherbarriere?
Garantiert WaitGroup.Wait() eine Speicherbarriere?
Bedenken Sie den folgenden Codeausschnitt:
var condition bool var wg sync.WaitGroup for _, item := range items { wg.Add(1) go func(item) { if meetsCondition(item) { condition = true } wg.Done() }(item) } wg.Wait() // is it safe to check condition here?
The Es stellt sich die Frage, ob es sicher ist, die Bedingungsvariable nach der Rückkehr von wg.Wait() zu überprüfen. In der offiziellen Go-Dokumentation werden keine Auswirkungen auf Speicherbarrieren ausdrücklich erwähnt, aber in der WaitGroup-Dokumentation heißt es, dass Wait blockiert, bis der Wartegruppenzähler Null erreicht.
Lösung
Ja, Es ist sicher, die Bedingungsvariable nach der Rückkehr von wg.Wait() zu überprüfen. Es gibt eine implizite „events-before“-Beziehung zwischen wg.Wait() und wg.Done(). Wenn eine Goroutine wg.Done() aufruft, stellt sie sicher, dass alle abgeschlossenen Vorgänge für andere Goroutinen sichtbar werden, die wg.Wait() bereits aufgerufen haben. Daher fungiert wg.Wait() effektiv als Speicherbarriere und stellt sicher, dass die Bedingungsvariable vor der Prüfung nach der Rückkehr von wg.Wait() aktualisiert wird.
Diese Vorher-Beziehung ist nicht explizit dokumentiert, wurde aber bereits dokumentiert von Go-Entwicklern bestätigt. Weitere Informationen finden Sie im Go-Forenthread hier.
Das obige ist der detaillierte Inhalt vonWirkt WaitGroup.Wait() in Go als Speicherbarriere?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!