Maison  >  Article  >  développement back-end  >  Une goroutine qui imprime alternativement les nombres pairs et impairs reste bloquée dans une impasse

Une goroutine qui imprime alternativement les nombres pairs et impairs reste bloquée dans une impasse

王林
王林avant
2024-02-13 16:00:101235parcourir

交替打印奇数和偶数的 goroutine 陷入死锁

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

Contenu des questions

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
}

Solution

Le problème peut être résolu des manières suivantes

  1. Supprimez le deuxième gofunc pour le capuchon (ligne 20)
  2. selecting 写入 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer