Heim  >  Artikel  >  Backend-Entwicklung  >  Eine Goroutine, die abwechselnd ungerade und gerade Zahlen ausgibt, bleibt im Deadlock stecken

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

王林
王林nach vorne
2024-02-13 16:00:101234Durchsuche

交替打印奇数和偶数的 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()
}

[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
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen