Heim > Backend-Entwicklung > Golang > Warum ist die Platzierung von wg.Add() für die garantierte Synchronisierung in Go entscheidend?

Warum ist die Platzierung von wg.Add() für die garantierte Synchronisierung in Go entscheidend?

DDD
Freigeben: 2024-10-27 20:40:03
Original
787 Leute haben es durchsucht

Why is wg.Add() Placement Crucial for Guaranteed Synchronization in Go?

Positionierung von wg.Add() für garantierte Synchronisierung

Problem

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>
Nach dem Login kopieren

Lösung

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>
Nach dem Login kopieren

Erklärung

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.

Best Practices

Befolgen Sie bei der Verwendung von sync.WaitGroup diese Richtlinien:

  • Rufen Sie wg.Add() in der „ursprünglichen“ Goroutine auf, bevor Sie eine neue Goroutine mit go starten.
  • Verwenden Sie eine Defer-Anweisung, um wg.Done() aufzurufen, um sicherzustellen es wird auch dann aufgerufen, wenn die Goroutine in Panik gerät.
  • Wenn Sie wg an andere Funktionen übergeben, übergeben Sie einen Zeiger, um zu vermeiden, dass Kopien der wg-Struktur erstellt werden.

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage