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, 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.
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 }
Das Problem kann auf folgende Arten gelöst werden
select
ing 写入 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!