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!
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.
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!