Maison > développement back-end > Golang > Où devez-vous placer `wg.Add()` et `wg.Done()` pour une synchronisation Goroutine correcte dans Go ?

Où devez-vous placer `wg.Add()` et `wg.Done()` pour une synchronisation Goroutine correcte dans Go ?

Susan Sarandon
Libérer: 2024-11-04 05:28:29
original
862 Les gens l'ont consulté

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

Placement d'insertion WaitGroup pour la synchronisation Goroutine

Dans Go, le type sync.WaitGroup facilite la synchronisation entre les goroutines en gardant une trace du nombre d'actifs goroutines et attendez que toutes les goroutines aient terminé leur exécution avant de continuer. Le placement correct des appels wg.Add() et wg.Done() est crucial pour garantir un comportement correct.

Considérez le code suivant :

<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

Dans cet exemple, wg.Add( 1) est placé par erreur dans la fonction anonyme. Ce placement incorrect peut conduire à des valeurs de v incohérentes, souvent inférieures à 100.

La raison de cet écart réside dans la nature concurrente des goroutines. Lorsqu'il est placé dans la goroutine, wg.Add(1) peut s'exécuter en même temps que wg.Done(), provoquant la reprise prématurée de wg.Wait() et une sous-estimation du nombre de goroutines terminées.

Pour résoudre ce problème, wg.Add(1) doit être placé dans la boucle for avant de lancer chaque goroutine :

<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

Cet ajustement garantit que wg.Wait() bloquera jusqu'à ce que tous les appels à wg.Done() aient été effectués, permettant à v de refléter avec précision le nombre de goroutines terminées.

En résumé, placez toujours wg.Add() avant de lancer une goroutine et wg.Done() une fois que la goroutine a terminé son exécution pour garantir une synchronisation correcte et un résultat fiable calcul.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal