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 les nombres pairs et impairs reste bloquée dans une impasse

王林
Libérer: 2024-02-13 16:00:10
avant
1277 Les gens l'ont consulté

交替打印奇数和偶数的 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()
}
Copier après la connexion

[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
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal