Maison  >  Article  >  développement back-end  >  Pourquoi ma routine Go imprime-t-elle des valeurs inattendues en raison de la réorganisation de la mémoire ?

Pourquoi ma routine Go imprime-t-elle des valeurs inattendues en raison de la réorganisation de la mémoire ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-23 06:58:17433parcourir

Why Does My Go Routine Print Unexpected Values Due to Memory Reordering?

Problème de routine Go : synchronisation incorrecte

Le problème que vous avez rencontré dans GoLang provient de son modèle de mémoire. Selon la documentation, au sein d'une seule goroutine, les lectures et les écritures peuvent être réorganisées tant que cela n'affecte pas le comportement au sein de cette goroutine.

Considérez ce code :

var a, b int

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

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

func main() {
    go f()
    g()
}

En raison à la réorganisation du modèle de mémoire, vous pouvez observer que g() affiche 2 puis 0. Même si l'affectation de a précède celle de b dans f(), le compilateur peut optimisez le code en attribuant b en premier pour des raisons d'efficacité.

Au sein d'une même goroutine, l'ordre des affectations est garanti, car le compilateur ne peut pas les réorganiser si cela cause des problèmes. Cependant, dans l’exemple donné, il n’y a pas de synchronisation entre les deux goroutines. Par conséquent, le compilateur n'est pas obligé de prendre en compte l'impact potentiel de la réorganisation sur l'autre goroutine.

Si vous introduisez une synchronisation entre les goroutines, comme un WaitGroup ou un mutex, le compilateur s'assurera qu'il n'y a pas d'incohérences. au point de synchronisation. Dans ce cas, vous vous attendez à ce que g() imprime 2 et 1, car les deux affectations seront terminées avant les appels print().

Comprendre cet aspect du modèle de mémoire de GoLang est crucial pour écrire des programmes concurrents et éviter conditions de concurrence potentielles ou autres problèmes qui pourraient survenir en raison d'une réorganisation inattendue.

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