Comportement des variables partagées Goroutine dans Go
Question :
Lors de l'exploration des fonctionnalités de concurrence de Go, un développeur a rencontré un comportement inattendu lors du partage de variables entre goroutines. En présence de certaines modifications de code, les sorties différaient nettement.
Dans l'extrait de code ci-dessous, chaque goroutine imprime correctement sa valeur x correspondante :
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(x) }() } wg.Wait() fmt.Println("Done") }
Cependant, une légère modification du le code produit un résultat uniforme pour toutes les goroutines :
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go func() { defer wg.Done() fmt.Println(i) }() } wg.Wait() fmt.Println("Done") }
Réponse :
Dans le premier extrait, chaque goroutine a une nouvelle instance de la variable x. En effet, x := i crée une nouvelle variable à chaque itération de boucle.
Pour démontrer cela, nous pouvons imprimer l'adresse mémoire de x à l'intérieur de chaque goroutine :
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) x := i go func() { defer wg.Done() fmt.Println(&x) }() } wg.Wait() fmt.Println("Done") }
Exécuter ce code affichera différentes adresses mémoire pour chaque goroutine.
Dans le deuxième extrait, la variable i est directement référencée dans la fonction anonyme passée à go func(). Cela signifie que toutes les goroutines partagent la même valeur i, ce qui explique la sortie uniforme.
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!