Eine Goroutine, die abwechselnd ungerade und gerade Zahlen ausgibt, bleibt im Deadlock stecken

王林
Freigeben: 2024-02-13 16:00:10
nach vorne
1203 Leute haben es durchsucht

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

„Eine Goroutine, die abwechselnd ungerade und gerade Zahlen ausgibt, steckt in einem Deadlock fest“ ist ein häufiges Problem bei der gleichzeitigen Programmierung. Wenn Goroutine für gleichzeitige Vorgänge verwendet wird und kein korrekter Synchronisierungsmechanismus vorhanden ist, kann es leicht zu einem Deadlock kommen. Deadlock ist ein Zustand, in dem zwei oder mehr Prozesse (oder Goroutinen) die Ausführung nicht fortsetzen können, weil sie darauf warten, dass der andere Prozesse (oder Goroutinen) freigibt. In diesem Artikel wird die Ursache dieses Problems vorgestellt und Lösungen bereitgestellt, die Entwicklern helfen, das Deadlock-Problem bei der gleichzeitigen Programmierung besser zu verstehen.

Frageninhalt

Ich lerne gerade Golang. Ich möchte überprüfen, wie Golang-Kanäle funktionieren. Ich habe ein Programm erstellt, in dem zwei Goroutinen abwechselnd ungerade und gerade Zahlen ausgeben. Auch wenn das Programm korrekt druckt, zeigt es am Ende immer noch einen Deadlock-Fehler an. Aus der Fehlermeldung geht nicht klar hervor, was dieses Problem verursacht.

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()
}
Nach dem Login kopieren

[Bearbeiten] Danke für eure Antworten. Ich habe den folgenden Code geschrieben, um das Problem zu lösen.

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
}
Nach dem Login kopieren

Lösung

Das Problem kann auf folgende Arten gelöst werden

  1. Entfernen Sie die zweiten Gofuncs für cap (Zeile 20)
  2. selecting 写入 even (Zeile 28)

Das obige ist der detaillierte Inhalt vonEine Goroutine, die abwechselnd ungerade und gerade Zahlen ausgibt, bleibt im Deadlock stecken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!