Maison > Article > développement back-end > Pourquoi l'exécution simultanée de Go peut-elle conduire à des valeurs de variables inattendues ?
Le document du modèle de mémoire GoLang indique que le code suivant peut entraîner l'impression de g 2 suivi de 0 :
var a, b int func f() { a = 1 b = 2 } func g() { print(b) print(a) } func main() { go f() g() }
Ce comportement découle de la nature asynchrone des routines Go. Avant toute exécution de fonction, les variables a et b sont initialisées à leurs valeurs nulles respectives (0). La fonction f() modifie ces variables et la fonction g() imprime ensuite leurs valeurs.
Au sein d'une goroutine, la spécification du langage garantit que les lectures et les écritures se produisent dans l'ordre spécifié par le programme. Cependant, une réorganisation des opérations peut avoir lieu sans affecter le comportement de la goroutine, ce qui est le cas ici.
Dans la goroutine f(), le compilateur peut optimiser en réorganisant les affectations de b et a. Étant donné que la goroutine n'utilise pas ces variables après l'affectation, la réorganisation n'affecte pas son comportement.
La synchronisation entre les goroutines, en revanche, nécessite de la cohérence. Aux points de synchronisation, le compilateur garantit que toutes les affectations ont été terminées, garantissant que a et b ont leurs valeurs attribuées au moment où la goroutine g() les lit. Cela garantit une impression correcte des valeurs modifiées (2 et 1).
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!