Maison  >  Article  >  développement back-end  >  Pourquoi le placement de `wg.Add()` est-il crucial pour une bonne synchronisation dans `sync.WaitGroup` de Go ?

Pourquoi le placement de `wg.Add()` est-il crucial pour une bonne synchronisation dans `sync.WaitGroup` de Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-30 01:49:02150parcourir

  Why is the Placement of `wg.Add()` Crucial for Proper Synchronization in Go's `sync.WaitGroup`?

Correction du placement wg.Add() pour la synchronisation WaitGroup

Dans Go, le type sync.WaitGroup assure la synchronisation entre les goroutines. Son objectif principal est de permettre au goroutine principal d'attendre qu'un groupe de goroutines termine ses tâches. Cependant, le placement des appels wg.Add() est crucial pour assurer une bonne synchronisation.

Dans l'exemple incorrect :

<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>

L'appel wg.Add(1) est placé à l'intérieur du fonction anonyme, ce qui est une erreur. Ce placement malavisé peut conduire à une situation où wg.Wait() revient prématurément car wg.Add(1) est exécuté après wg.Done() dans la même goroutine. Par conséquent, v ne reflétera pas avec précision le nombre de tâches terminées et sa valeur sera probablement inférieure à 100.

Dans l'exemple corrigé :

<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>

Le wg.Add( 1) l'appel est maintenant placé en dehors de la fonction anonyme, garantissant que la goroutine principale a invoqué les 100 goroutines et enregistré leurs tâches d'achèvement avec wg avant d'appeler wg.Wait(). Ce placement correct garantit que wg.Wait() se bloquera jusqu'à ce que les 100 goroutines aient terminé leurs tâches, ce qui donnera une valeur précise de v.

Règles générales d'utilisation de sync.WaitGroup :

Pour garantir une synchronisation réussie à l'aide de sync.WaitGroup, suivez ces directives :

  • Appelez toujours wg.Add() dans la goroutine principale avant de démarrer une nouvelle goroutine.
  • Il est recommandé d'appeler wg.Done() à l'aide de l'instruction defer pour garantir qu'elle est exécutée même en cas de panique goroutine.
  • Lors du passage d'un sync.WaitGroup à d'autres fonctions (évitez d'utiliser des variables au niveau du package ), transmettez-lui un pointeur pour empêcher la copie et garantir que toutes les modifications sont apportées au sync.WaitGroup d'origine.

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!

Déclaration:
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