Heim  >  Artikel  >  Backend-Entwicklung  >  Ist das eine Rennbedingung in Go?

Ist das eine Rennbedingung in Go?

王林
王林nach vorne
2024-02-15 09:06:08507Durchsuche

这是 Go 中的竞争条件吗

php-Editor Apple beantwortet in diesem Artikel eine häufig gestellte Frage für Sie: „Ist dies eine Race-Bedingung in Go?“ Beim Schreiben gleichzeitiger Programme sind Race-Bedingungen ein häufiges Problem, das zu Dateninkonsistenzen und anderen unerwarteten Ergebnissen führen kann. In der Go-Sprache können wir Mechanismen wie Mutex-Sperren und Kanäle verwenden, um Race Conditions zu vermeiden. Lassen Sie uns gemeinsam darüber diskutieren!

Frageninhalt

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

Ich sehe das in vielen Taschen.

Warum wird dies nicht als Rennbedingung angesehen?

go run -race . Keine Fehler.

Lösung

Wie @volker betonte, handelt es sich hierbei um einen Datenwettlauf. Und da es nur einmal geschrieben wurde, ist es schwer zu erkennen. Hier ist eine modifizierte Demo, die leicht Data-Race-Fehler auslösen kann:

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

Das obige ist der detaillierte Inhalt vonIst das eine Rennbedingung in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen