提供されたコードでは、デッドロックが発生します。適切なチャネル処理が行われていないことが原因です。問題は UnloadTrucks 関数で発生し、ch チャネルにトラックが到着するのを無期限にブロックすることになります。ただし、メインの goroutine はこのチャネルを決して閉じないため、無限の待機が発生します。
デッドロックを解決するには、すべてのトラックがロードされて送信された後に ch チャネルを閉じる必要があります。チャンネルを通して。これは、WaitGroup を使用して、トラックをロードしているゴルーチンを追跡することで実現できます。
go func() { wg.Wait() close(ch) }()
すべてのゴルーチンがトラックのロードを完了すると、チャネル 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 の「すべてのゴルーチンがスリープ状態」デッドロックを解決する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。