Est-ce parce que le compilateur go a optimisé le code ?
Dans le code Go fourni, la variable i est partagée entre la goroutine principale et un goroutine simultané créé à l'aide de go func() { ... }(). Le but de la goroutine concurrente est d'incrémenter i indéfiniment. Cependant, lors de l'exécution du programme, vous avez remarqué que la sortie est toujours 1, même si l'on s'attend à un nombre beaucoup plus grand puisque la goroutine concurrente a suffisamment de temps pour incrémenter i plusieurs fois.
Pour comprendre ce comportement, nous devons considérez le modèle de mémoire Go et les optimisations du compilateur.
Modèle de mémoire Go
Le modèle de mémoire Go spécifie les conditions dans lesquelles les lectures d'une variable dans une goroutine peuvent être garanties pour observer les valeurs produites par les écritures dans la même variable dans une goroutine différente.
Selon le modèle de mémoire Go, pour que les modifications apportées aux variables partagées soient visibles dans les goroutines, elles doivent être suivies d'un événement de synchronisation, tel que une opération de canal ou le verrouillage d'un mutex.
Optimisations du compilateur
Dans votre exemple, l'affectation à i dans la goroutine simultanée n'est suivie d'aucun événement de synchronisation. En conséquence, il n'est pas garanti que l'affectation soit respectée par la goroutine principale et le compilateur est libre d'optimiser le code comme bon lui semble.
Le compilateur agressif peut optimiser le code en éliminant complètement l'opération d'incrémentation. , réduisant efficacement la goroutine concurrente à une boucle infinie qui ne fait rien. Cette optimisation expliquerait pourquoi la sortie est toujours 1, car la goroutine principale n'observe jamais les incréments effectués par la goroutine concurrente.
Pour garantir que les mises à jour des variables partagées sont correctement propagées entre les goroutines, il est important de synchroniser les accès. à ces variables à l'aide de canaux, de mutex ou d'autres primitives de synchronisation fournies par les packages sync et sync/atomic de Go.
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!