Maison > développement back-end > Golang > Pourquoi Might Go\'s `go f(); g()` Imprimer \'20\' Au lieu de \'21\' ?

Pourquoi Might Go\'s `go f(); g()` Imprimer \'20\' Au lieu de \'21\' ?

DDD
Libérer: 2024-11-23 15:00:17
original
792 Les gens l'ont consulté

Why Might Go's `go f(); g()` Print

Synchronisation incorrecte dans Go Lang

Le document du modèle de mémoire Go explique que le code suivant peut entraîner l'impression de g 2 puis 0 :

var a, b int

func f() {
    a = 1
    b = 2
}

func g() {
    print(b)
    print(a)
}

func main() {
    go f()
    g()
}
Copier après la connexion

Explication :

  • Les variables a et b sont initialisées à leurs valeurs zéro (0) avant l'exécution de toute fonction.
  • La règle Happens Before dans le modèle de mémoire Go permet aux compilateurs et aux processeurs de réorganiser les opérations au sein d'une seule goroutine si la réorganisation n'affecte pas son comportement.
  • Dans la fonction f(), les affectations à a et b peuvent ne pas se produire dans l'ordre spécifié si la réorganisation ne fait pas de différence dans cette goroutine.
  • Depuis les affectations n'ont aucun impact dans la fonction f(), le compilateur peut les réorganiser pour des raisons d'efficacité.
  • Comme il n'y a pas de synchronisation entre les deux goroutines (c'est-à-dire f() et g()) dans l'exemple fourni, le compilateur ne cherche pas à assurer la cohérence entre eux.
  • Si toutefois vous introduisez une synchronisation entre les goroutines, le compilateur garantira qu'au point de synchronisation, les deux affectations sera « terminé ». Cela signifie que les valeurs correctes (2 et 1) seront imprimées dans g().

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!

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