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()
}
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: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