我的 dicerolling 程序發生了一次奇怪的崩潰。它工作正常,但最后它總是說:致命錯誤:所有 goroutine 都處于休眠狀態 - 死鎖!goroutine 1 [chan 接收]: main.main() /t?rning.go:43 +0x746goroutine 6 [chan receive]: main.dice(0xc00003a0c0, 0xc00003a120, 0xc0000100a0) /t?rning.go:51 +0x106 created by main.main /t?rning.go:40 +0x59agoroutine 7 [chan receive]: main.dice(0xc00003a0c0, 0xc00003a120, 0xc0000100a0) /t?rning.go:51 +0x106 created by main.main /t?rning.go:41 +0x5d3 exit status 2package mainimport ( "fmt" "sync" "math/rand")type t?rning struct { rubrik string minTal, maxTal int}type t?rningsSvar struct { rubrik string svaret int}func main() { var wg sync.WaitGroup fmt.Println("Dags att kasta t?rningar") var antal int fmt.Println("Hur m?nga t?rningar vill du anv?nda?") fmt.Scan(&antal) job := make(chan t?rning, antal) svar := make(chan t?rningsSvar, antal) for i := 0; i < antal; i++ { fmt.Println("Vad ska t?rning", i+1, "ha f?r rubrik?") var text string fmt.Scan(&text) fmt.Println("Vad ska vara minsta v?rdet p? t?rningen?") var minsta int fmt.Scan(&minsta) fmt.Println("Vad ska vara st?rsta v?rdet p? t?rningen?") var st?rsta int fmt.Scan(&st?rsta) job <- t?rning{rubrik: text, minTal: minsta, maxTal: st?rsta} } go dice(job, svar, &wg) go dice(job, svar, &wg) wg.Wait() for svaren := range svar { fmt.Println("T?rning " + svaren.rubrik + " fick: ", svaren.svaret) }}func dice(job chan t?rning, svar chan t?rningsSvar, wg *sync.WaitGroup) { wg.Add(1) for item := range job { text := item.rubrik min := item.minTal max := item.maxTal slump := (rand.Intn(max - min) + min) svar <- t?rningsSvar{rubrik: text, svaret: slump} } wg.Done()}
1 回答

呼如林
TA貢獻1798條經驗 獲得超3個贊
我已在此處修復了您的代碼:https: //play.golang.org/p/ZgRRb-wOdDk并附有評論。請檢查。
您的代碼中有多個問題。1.你 wg.Add(1)
在代碼中使用的方式,它不起作用。你必須wg.Add(2)
在開始你的 goroutine 之前放置并刪除wg.Add(1)
from dice 功能,因為可能會出現比賽情況并且你wg.Add(1)
可以在已經運行時wg.Wait()
運行。
您正在從事頻道工作。您沒有關閉任何頻道。此外,范圍查詢是一個阻塞調用。同時,您
svaren := range svar
也將被阻止,因為沒有人會向其中添加項目。因此,程序將陷入主函數被阻止從svar
通道讀取數據的情況。而且,dice
功能卡住了,因為通道中沒有數據job
并且它被item := range job
一步阻塞。因此,如果兩個 goroutine 相互等待,則會導致死鎖情況。
- 1 回答
- 0 關注
- 135 瀏覽
添加回答
舉報
0/150
提交
取消