Maison >développement back-end >Golang >Une goroutine qui imprime alternativement les nombres pairs et impairs reste bloquée dans une impasse
"Une goroutine qui imprime alternativement des nombres pairs et impairs est bloquée dans une impasse" est un problème courant en programmation concurrente. Lors de l'utilisation de goroutine pour des opérations simultanées, s'il n'y a pas de mécanisme de synchronisation correct, cela peut facilement conduire à une impasse. L'impasse est un état dans lequel deux ou plusieurs processus (ou goroutines) sont incapables de poursuivre leur exécution car ils attendent l'un l'autre pour libérer des ressources. Cet article présentera la cause de ce problème et fournira des solutions pour aider les développeurs à mieux comprendre le problème de blocage dans la programmation simultanée.
J'apprends actuellement le golang. Je veux vérifier comment fonctionnent les chaînes Golang. J'ai créé un programme dans lequel deux goroutines imprimeront alternativement des nombres pairs et impairs. Même si le programme s'imprime correctement, il affiche toujours une erreur de blocage à la fin. Le message d'erreur ne montre pas clairement la cause de ce problème.
func main() { even := make(chan bool) odd := make(chan bool) go func() { defer close(odd) for i := 0; i <= 10; i += 2 { <-even print("even ====>") println(i) odd <- true } }() var wait sync.waitgroup wait.add(1) go func() { for i := 1; i <= 10; i += 2 { _, ok := <-odd if !ok { wait.done() return } print("odd ====>") println(i) even <- true } }() even <- true wait.wait() }
[modifier] merci pour vos réponses. J'ai écrit le code suivant pour résoudre le problème.
func main() { even := make(chan bool) odd := make(chan bool) done := make(chan bool) //var wait sync.WaitGroup //wait.Add(2) go func() { for i := 0; i <= 10; i += 2 { <-even print("Even ====>") println(i) odd <- true } close(odd) close(even) done <- true // wait.Done() }() go func() { for i := 1; ; i += 2 { _, ok := <-odd if !ok { //wait.Done() return } print("Odd ====>") println(i) select { case even <- true: case <-done: return } } }() even <- true //wait.Wait() <-done }
Le problème peut être résolu des manières suivantes
select
ing 写入 even
(ligne 28) 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!