Deadlock in Go: „Alle Goroutinen schlafen“ verstehen und beheben
Im bereitgestellten Go-Code-Snippet tritt ein Deadlock aufgrund von a auf Missverständnis der Goroutine-Kommunikation. Ziel des Programms ist es, das Be- und Entladen von LKWs zu simulieren und dabei Goroutinen für die LKW-Entladung einzusetzen. Allerdings kann der Code den LKW-Kanal (ch) nicht schließen, wenn der Ladevorgang abgeschlossen ist, was zu einem Deadlock führt.
Um diesen Deadlock zu beheben, ist es wichtig, den LKW-Kanal (ch) zu schließen, sobald alle LKWs abgeschlossen sind wurden geladen. Dies signalisiert der UnloadTrucks-Goroutine, dass keine weiteren LKWs gesendet werden, sodass sie zurückkehren kann.
Eine Möglichkeit, dies zu erreichen, ist die Verwendung einer WaitGroup, wie im folgenden Code gezeigt:
// Define a WaitGroup to track the completion of the loading goroutines var wg sync.WaitGroup // Start goroutines to load trucks go func() { // Load trucks and send them over the truck channel for t := range trucks { go func(tr Truck) { itm := Item{} itm.name = "Groceries" fmt.Printf("Loading %s\n", tr.name) tr.Cargo = append(tr.Cargo, itm) ch <- tr wg.Done() // Signal the WaitGroup that the loading is complete }(trucks[t]) } }() // Use the WaitGroup to wait for all loading goroutines to complete wg.Wait() // Close the truck channel after all loading is finished close(ch) // Start the UnloadTrucks goroutine UnloadTrucks(ch)
Durch das Schließen des LKW-Kanals (ch), sobald alle LKWs beladen wurden, kann die UnloadTrucks-Goroutine beendet werden, wodurch der Deadlock aufgehoben wird. Das Programm wird nun erfolgreich abgeschlossen und alle LKWs werden wie vorgesehen entladen.
Das obige ist der detaillierte Inhalt vonWie kann Gos „Alle Goroutinen schlafen'-Deadlock in der Goroutine-Kommunikation gelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!