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>
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>
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.
Lors de l'utilisation 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!