Heim > Artikel > Backend-Entwicklung > Wo sollten Sie „wg.Add()“ und „wg.Done()“ für eine korrekte Goroutine-Synchronisierung in Go platzieren?
WaitGroup-Einfügungsplatzierung für Goroutine-Synchronisierung
In Go erleichtert der Typ sync.WaitGroup die Synchronisierung zwischen Goroutinen, indem er die Anzahl der aktiven verfolgt Goroutinen ausführen und warten, bis alle Goroutinen ihre Ausführung abgeschlossen haben, bevor Sie fortfahren. Die richtige Platzierung der Aufrufe wg.Add() und wg.Done() ist entscheidend für die Sicherstellung des korrekten Verhaltens.
Beachten Sie den folgenden Code:
<code class="go">var wg sync.WaitGroup var v int32 = 0 for i = 0; i < 100; i++{ go func(){ wg.Add(1) // wrong place atomic.AddInt32(&v,1) wg.Done() } } wg.Wait() fmt.Println(v)</code>
In diesem Beispiel wg.Add( 1) wird fälschlicherweise innerhalb der anonymen Funktion platziert. Diese falsche Platzierung kann zu inkonsistenten Werten von v führen, die oft unter 100 liegen.
Der Grund für diese Diskrepanz liegt in der Parallelität von Goroutinen. Wenn wg.Add(1) in der Goroutine platziert wird, kann es gleichzeitig mit wg.Done() ausgeführt werden, was dazu führt, dass wg.Wait() vorzeitig fortgesetzt wird und die Anzahl der abgeschlossenen Goroutinen unterschätzt.
Um dieses Problem zu beheben, wg.Add(1) sollte in die for-Schleife eingefügt werden, bevor jede Goroutine gestartet wird:
<code class="go">var wg sync.WaitGroup var v int32 = 0 for i = 0; i < 100; i++{ wg.Add(1) go func(){ atomic.AddInt32(&v,1) wg.Done() } } wg.Wait() fmt.Println(v)</code>
Diese Anpassung stellt sicher, dass wg.Wait() blockiert, bis alle wg.Done()-Aufrufe getätigt wurden. Dadurch kann v die Anzahl der abgeschlossenen Goroutinen genau wiedergeben.
Zusammenfassend lässt sich sagen, dass wg.Add() immer vor dem Start einer Goroutine und wg.Done() platziert wird, sobald die Goroutine ihre Ausführung abgeschlossen hat, um eine ordnungsgemäße Synchronisierung und ein zuverlässiges Ergebnis sicherzustellen Berechnung.
Das obige ist der detaillierte Inhalt vonWo sollten Sie „wg.Add()“ und „wg.Done()“ für eine korrekte Goroutine-Synchronisierung in Go platzieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!