"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi mon Goroutine incrémentant une variable produit-il des résultats inattendus ?

Pourquoi mon Goroutine incrémentant une variable produit-il des résultats inattendus ?

Publié le 2024-11-05
Parcourir:843

Why Does My Goroutine Incrementing a Variable Produce Unexpected Results?

Est-ce un résultat de l'optimisation du compilateur ?

Dans cet extrait de code, une goroutine est lancée et incrémente à plusieurs reprises la variable i :

package main

import "time"

func main() {
    i := 1
    go func() {
        for {
            i  
        }
    }()
    

Cependant, la sortie est toujours 1. Ce comportement peut être attribué au modèle de mémoire Go et à l'implémentation spécifique de ce code.

Le modèle de mémoire Go

Le modèle de mémoire Go

Le Le modèle de mémoire Go définit 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. Il souligne l'importance de la synchronisation pour l'accès simultané aux données partagées.

Omettre la synchronisation

    Dans le code donné :
  • L'affectation à i (c'est-à-dire i ) n'est suivi d'aucun événement de synchronisation, indiquant que les modifications peuvent ne pas être immédiatement visibles par les autres goroutines.
Le compilateur peut optimiser cette optimisation de boucle en la simplifiant à un non-op.

Optimisation par le compilateur

for {}

pour {}

Exemple avec synchronisation

package main

import (
    "sync"
    "time"
)

func main() {
    mx := new(sync.Mutex)
    i := 1
    go func() {
        for {
            mx.Lock()
            i  
            mx.Unlock()
        }
    }()
    

package main importer ( "synchroniser" "temps" ) fonction main() { mx := nouveau(sync.Mutex) je := 1 allez func() { pour { mx.Lock() je mx.Déverrouiller() } }()

Dans ce cas, la sortie n'est plus 1, mais un grand nombre, comme prévu. Le sync.Mutex assure la synchronisation et garantit que les deux goroutines accèdent à i de manière contrôlée, permettant à la goroutine d'incrémenter i et rendant les modifications visibles à la routine principale.Why Does My Goroutine Incrementing a Variable Produce Unexpected Results?

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3