在提供的程式碼中,您會遇到因死鎖而導致的死鎖缺乏適當的渠道處理。問題出現在 UnloadTrucks 函數中,您無限期地阻塞等待卡車到達 ch 通道。然而,主協程永遠不會關閉這個通道,從而導致無休止的等待。
要解決死鎖,必須在所有卡車裝載並發送後關閉 ch 通道通過通道。這可以透過使用 WaitGroup 來追蹤正在裝載卡車的 goroutine 來實現:
go func() { wg.Wait() close(ch) }()
當所有 goroutine 完成裝載卡車時,通道 ch 將關閉,允許 UnloadTrucks 繼續進行。
package main import ( "fmt" "sync" "time" ) type Item struct { name string } type Truck struct { Cargo []Item name string } func UnloadTrucks(c chan Truck) { for t := range c { fmt.Printf("%s has %d items in cargo: %s\n", t.name, len(t.Cargo), t.Cargo[0].name) } } func main() { trucks := make([]Truck, 2) ch := make(chan Truck) var wg sync.WaitGroup for i, _ := range trucks { trucks[i].name = fmt.Sprintf("Truck %d", i+1) fmt.Printf("Building %s\n", trucks[i].name) } for t := range trucks { wg.Add(1) 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() }(trucks[t]) } time.Sleep(50 * time.Millisecond) fmt.Println("Unloading Trucks") UnloadTrucks(ch) fmt.Println("Done") }
以上是如何解決 Go 中「所有 goroutine 都在睡覺」的死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!