Maison  >  Article  >  développement back-end  >  Pourquoi la sortie de mon programme Go est-elle toujours 1 lorsqu'une goroutine concurrente incrémente une variable partagée ?

Pourquoi la sortie de mon programme Go est-elle toujours 1 lorsqu'une goroutine concurrente incrémente une variable partagée ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-31 01:36:29548parcourir

Why is the output of my Go program always 1 when a concurrent goroutine is incrementing a shared variable?

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!

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