제공된 코드에서 교착 상태가 발생합니다. 적절한 채널 처리가 부족하기 때문입니다. 문제는 트럭이 ch 채널에 도착할 때까지 기다리는 것을 무기한 차단하는 UnloadTrucks 기능에서 발생합니다. 그러나 메인 고루틴은 이 채널을 절대 닫지 않아 끝없는 대기가 발생합니다.
교착 상태를 해결하려면 모든 트럭이 로드되고 전송된 후 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!