Maison >développement back-end >Golang >Pourquoi la valeur de ma Goroutine n'est-elle pas visible pour les autres ?

Pourquoi la valeur de ma Goroutine n'est-elle pas visible pour les autres ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-29 11:37:30735parcourir

Why Is My Goroutine's Value Not Visible to Others?

Est-ce parce que le compilateur Go a optimisé le code ?

Le problème n'est pas une optimisation par le compilateur Go, mais plutôt un manque de synchronisation. L'affectation à i n'est suivie d'aucun événement de synchronisation, il n'est donc pas garanti qu'elle soit observée par une autre goroutine. En fait, un compilateur agressif pourrait supprimer l'intégralité de l'instruction i.

Le 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 un goroutine peut être assuré d'observer les valeurs produites par les écritures dans la même variable dans une goroutine différente.

Pour sérialiser l'accès, protégez les données avec des opérations de canal ou d'autres primitives de synchronisation telles que celles des packages sync et sync/atomic. .

Si vous devez lire la suite de ce document pour comprendre le comportement de votre programme, vous êtes trop malin. Ne soyez pas malin.

Synchronisation

Dans l'exemple suivant, l'affectation à a n'est suivie d'aucun événement de synchronisation, il n'est donc pas garanti qu'elle soit observée par n'importe quel autre goroutine. En fait, un compilateur agressif pourrait supprimer l'intégralité de l'instruction go.

<code class="go">var a string

func hello() {
  go func() { a = "hello" }()
  print(a)
}</code>

L'exemple suivant montre comment sérialiser l'accès à i à l'aide d'un sync.Mutex.

<code class="go">package main

import (
    "sync"
    "time"
)

func main() {
    mx := new(sync.Mutex)
    i := 1
    go func() {
        for {
            mx.Lock()
            i++
            mx.Unlock()
        }
    }()
    <-time.After(1 * time.Second)
    mx.Lock()
    println(i)
    mx.Unlock()
}</code>

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