Go 中的死鎖:理解並解決「所有Goroutines 都處於睡眠狀態」
在提供的Go 程式碼片段中,由於以下原因發生了死鎖對goroutine 通訊的誤解。該程式旨在模擬卡車的裝卸,使用 goroutine 來處理卡車卸載。然而,當加載過程完成時,代碼無法關閉卡車通道(ch),導致死鎖。
要解決此死鎖,關鍵是一旦所有卡車都關閉後,關閉卡車通道(ch)已加載。這向 UnloadTrucks goroutine 發出信號,表明將不再發送卡車,從而允許其返回。
實現此目的的一種方法是使用WaitGroup,如以下程式碼所示:
// 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)
一旦所有卡車都已裝載,透過關閉卡車通道(ch),UnloadTrucks goroutine 可以終止,從而打破僵局。該程序現在將成功完成,按預期卸載所有卡車。
以上是如何解決Go中Goroutine通訊中的「All Goroutine Are Sleep」死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!