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
Libérer: 2024-10-29 11:37:30
original
734 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal