Maison > développement back-end > Golang > Pourquoi le placement de wg.Add() est-il crucial pour une synchronisation garantie dans Go ?

Pourquoi le placement de wg.Add() est-il crucial pour une synchronisation garantie dans Go ?

DDD
Libérer: 2024-10-27 20:40:03
original
787 Les gens l'ont consulté

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

Positionnement de wg.Add() pour une synchronisation garantie

Problème

Dans le code Go ci-dessous, la variable v est souvent inférieure à celle attendue en raison à un placement incorrect de 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>
Copier après la connexion

Solution

wg.Add() doit toujours être appelé avant de lancer la goroutine correspondante pour garantir que la goroutine principale se bloque jusqu'à ce que tout les goroutines ont exécuté wg.Done().

<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>
Copier après la connexion

Explication

Lorsque wg.Add() est placé à l'intérieur de la goroutine, il ne peut pas garantir que la goroutine principale se bloquera jusqu'à ce que toutes les goroutines soient terminées . En effet, les goroutines s'exécutent simultanément et l'ordre d'exécution n'est pas déterministe.

En plaçant wg.Add() avant la goroutine, nous nous assurons que la goroutine principale appelle wg.Add() 100 fois avant d'atteindre wg.Attendez(). Cela garantit que la goroutine principale se bloque jusqu'à ce que les 100 goroutines aient appelé wg.Done(), ce qui fait que v est systématiquement égal à 100.

Bonnes pratiques

Lors de l'utilisation de sync.WaitGroup, suivez ces directives :

  • Appelez wg.Add() dans la goroutine "originale" avant de démarrer une nouvelle goroutine en utilisant go.
  • Utilisez une instruction defer pour appeler wg.Done() pour vous assurer il est appelé même si la goroutine panique.
  • Lorsque vous passez wg à d'autres fonctions, transmettez un pointeur pour éviter de créer des copies de la structure wg.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal