Heim >Backend-Entwicklung >Golang >Wo sollten Sie „wg.Add()' und „wg.Done()' für eine korrekte Goroutine-Synchronisierung in Go platzieren?

Wo sollten Sie „wg.Add()' und „wg.Done()' für eine korrekte Goroutine-Synchronisierung in Go platzieren?

Susan Sarandon
Susan SarandonOriginal
2024-11-04 05:28:29869Durchsuche

 Where Should You Place `wg.Add()` and `wg.Done()` for Correct Goroutine Synchronization in Go?

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!

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