Maison > développement back-end > Golang > Est-ce une condition de concurrence dans Go ?

Est-ce une condition de concurrence dans Go ?

王林
Libérer: 2024-02-15 09:06:08
avant
577 Les gens l'ont consulté

这是 Go 中的竞争条件吗

éditeur php Apple répondra à une question courante pour vous dans cet article : "Est-ce une condition de concurrence dans Go ?" Lors de l'écriture de programmes concurrents, les conditions de concurrence sont un problème courant qui peut entraîner des incohérences de données et d'autres résultats inattendus. Dans le langage Go, nous pouvons utiliser des mécanismes tels que les verrous mutex et les canaux pour éviter les conditions de concurrence. Discutons-en ensemble !

Contenu des questions

func main() {
    m := map[string]int{
        "foo": 42,
        "bar": 1337,
    }

    go func() {
        time.Sleep(1 * time.Second)
        tmp := map[string]int{
            "foo": 44,
            "bar": 1339,
        }

        m = tmp
    }()

    for {
        val := m["foo"]
        fmt.Println(val)
    }
}
Copier après la connexion

Je vois ça dans beaucoup de sacs.

Pourquoi cela n'est-il pas considéré comme une condition de concurrence ?

go run -race . Aucune erreur.

Solution

Comme @volker l'a souligné, il s'agit d'une course aux données. Et comme ce n’est écrit qu’une seule fois, c’est difficile à détecter. Voici une démo modifiée qui peut facilement déclencher des erreurs de course aux données :

package main

import (
    "fmt"
    "time"
)

func main() {
    m := map[string]int{
        "foo": 42,
        "bar": 1337,
    }

    done := make(chan any)

    go func() {
        for i := 0; i < 100; i++ {
            time.Sleep(time.Microsecond)
            tmp := map[string]int{
                "foo": 44,
                "bar": 1339,
            }

            m = tmp
        }

        close(done)
    }()

    for {
        select {
        case <-done:
            return
        default:
            val := m["foo"]
            fmt.Println(val)
        }
    }
}
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!

Étiquettes associées:
source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal