Korrektur der wg.Add()-Platzierung für die WaitGroup-Synchronisierung
In Go sorgt der Typ sync.WaitGroup für die Synchronisierung zwischen Goroutinen. Sein Hauptzweck besteht darin, der Haupt-Goroutine zu ermöglichen, darauf zu warten, dass eine Gruppe von Goroutinen ihre Aufgaben erledigt. Die Platzierung von wg.Add()-Aufrufen ist jedoch entscheidend, um eine ordnungsgemäße Synchronisierung sicherzustellen.
Im falschen Beispiel:
<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>
Der wg.Add(1)-Aufruf wird innerhalb von platziert anonyme Funktion, was ein Fehler ist. Diese falsche Platzierung kann dazu führen, dass wg.Wait() vorzeitig zurückkehrt, weil wg.Add(1) nach wg.Done() innerhalb derselben Goroutine ausgeführt wird. Infolgedessen spiegelt v die Anzahl der abgeschlossenen Aufgaben nicht genau wider und sein Wert wird wahrscheinlich weniger als 100 betragen.
Im korrigierten Beispiel:
<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>
Die wg.Add( 1) Der Aufruf wird jetzt außerhalb der anonymen Funktion platziert, um sicherzustellen, dass die Haupt-Goroutine alle 100 Goroutinen aufgerufen und ihre Abschlussaufgaben bei wg registriert hat, bevor sie wg.Wait() aufruft. Diese korrekte Platzierung garantiert, dass wg.Wait() blockiert, bis alle 100 Goroutinen ihre Aufgaben abgeschlossen haben, was zu einem genauen Wert von v führt.
Allgemeine Regeln für die Verwendung von sync.WaitGroup:
Um eine erfolgreiche Synchronisierung mit sync.WaitGroup sicherzustellen, befolgen Sie diese Richtlinien:
Das obige ist der detaillierte Inhalt vonWarum ist die Platzierung von „wg.Add()' entscheidend für die ordnungsgemäße Synchronisierung in Gos „sync.WaitGroup'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!