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