在提供的代码中,您会遇到由于死锁而导致的死锁缺乏适当的渠道处理。问题出现在 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中文网其他相关文章!