亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

致命錯誤:所有 goroutine 都處于休眠狀態 - 死鎖(再次)

致命錯誤:所有 goroutine 都處于休眠狀態 - 死鎖(再次)

Go
HUH函數 2022-06-01 17:53:54
我的 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()運行。

  1. 您正在從事頻道工作。您沒有關閉任何頻道。此外,范圍查詢是一個阻塞調用。同時,您svaren := range svar也將被阻止,因為沒有人會向其中添加項目。因此,程序將陷入主函數被阻止從svar通道讀取數據的情況。而且,dice功能卡住了,因為通道中沒有數據job并且它被item := range job一步阻塞。

  2. 因此,如果兩個 goroutine 相互等待,則會導致死鎖情況。


查看完整回答
反對 回復 2022-06-01
  • 1 回答
  • 0 關注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號