Maison > Article > développement back-end > Pourquoi le placement de `wg.Add()` est-il crucial pour une bonne synchronisation dans `sync.WaitGroup` de Go ?
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 :
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!