var a string var done bool func setup() { a = "hello, world" done = true } func doprint() { if !done { once.Do(setup) } print(a) } func twoprint() { go doprint() go doprint() }
Variables :
Fonctions :
Concurrence dans main() :
Problèmes potentiels :
Résultats possibles
En raison du manque de synchronisation, la sortie du programme n'est pas déterministe. Voici les scénarios possibles :
Cas 1 : g() s'exécute avant que f() ne modifie a et b :
0 0
ou
CAS 2 : Si b = 2 est terminé avant g() mais que a = 1 ne l'est pas, le résultat pourrait être :
2 0
Observations clés
Course aux données : l'accès simultané à a et b sans synchronisation introduit une course aux données. Cela rend le comportement du programme indéfini et imprévisible
Correction du code
var a, b int var wg sync.WaitGroup func f() { a = 1 b = 2 wg.Done() } func g() { print(b) print(a) } func main() { wg.Add(1) go f() wg.Wait() g() }
var a, b int func f(done chan bool) { a = 1 b = 2 done <- true } func g() { print(b) print(a) } func main() { done := make(chan bool) go f(done) <-done g() }
Ici, g() attend que f() envoie un signal sur le canal terminé.
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!