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

Est-ce une condition de concurrence dans Go ?

王林
王林avant
2024-02-15 09:06:08508parcourir

这是 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)
    }
}

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)
        }
    }
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer