Heim  >  Artikel  >  Backend-Entwicklung  >  Wirkt WaitGroup.Wait() in Go als Speicherbarriere?

Wirkt WaitGroup.Wait() in Go als Speicherbarriere?

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 11:32:02125Durchsuche

 Does WaitGroup.Wait() Act as a Memory Barrier in Go?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn