Im Go-Code unten ist die Variable v oft kleiner als erwartet zu einer falschen Platzierung von wg.Add().
<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>
wg.Add() sollte immer vor dem Start der entsprechenden Goroutine aufgerufen werden, um sicherzustellen, dass die Haupt-Goroutine blockiert, bis alle Goroutinen haben wg.Done() ausgeführt.
<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>
Wenn wg.Add() innerhalb der Goroutine platziert wird, kann nicht garantiert werden, dass die Haupt-Goroutine blockiert, bis alle Goroutinen abgeschlossen sind . Dies liegt daran, dass die Goroutinen gleichzeitig ausgeführt werden und die Reihenfolge der Ausführung nicht deterministisch ist.
Durch die Platzierung von wg.Add() vor der Goroutine stellen wir sicher, dass die Haupt-Goroutine wg.Add() 100 Mal aufruft, bevor sie erreicht wg.Wait(). Dadurch wird sichergestellt, dass die Haupt-Goroutine blockiert, bis alle 100 Goroutinen wg.Done() aufgerufen haben, was dazu führt, dass v durchgängig gleich 100 ist.
Befolgen Sie bei der Verwendung von sync.WaitGroup diese Richtlinien:
Das obige ist der detaillierte Inhalt vonWarum ist die Platzierung von wg.Add() für die garantierte Synchronisierung in Go entscheidend?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!