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

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

golang所有goroutines都睡著了 - 死鎖

golang所有goroutines都睡著了 - 死鎖

Go
一只甜甜圈 2022-05-23 17:32:04
運行跟隨 golang 片段時出現錯誤。我認為進度將在 wg.Wait() 處阻塞,直到 go 例程結束。那么該值將從 c1 獲得。但它可能不會按預期進行。func main() {c1 := make(chan string)//var c1 chan stringvar wg sync.WaitGroupwg.Add(1)go func() {    defer wg.Done()    fmt.Printf("go routine begin\n")    time.Sleep(1 * time.Second)    c1 <- "one"    fmt.Printf("go routine done\n")}()wg.Wait()fmt.Printf("done c1: %v\n", <-c1)fmt.Printf("out\n")}錯誤信息是, go routine begin fatal error: all goroutines are asleep - deadlock!
查看完整描述

3 回答

?
心有法竹

TA貢獻1866條經驗 獲得超5個贊

寫入c1永遠不會執行,因為讀取c1是在之后wg.Wait(),它將停止直到c1被寫入。所以 main goroutine 等待,wg.Wait()嵌套 goroutine 等待c1write。

c1您可以使通道緩沖,或在單獨的 goroutine 上等待讀取。


查看完整回答
反對 回復 2022-05-23
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

在 Golang 中,無緩沖通道上的寫操作是阻塞的。從文檔中可以清楚地看到。

您的執行被阻止在

c1 <- "one"

延期聲明

defer wg.Done()

從不執行。


查看完整回答
反對 回復 2022-05-23
?
米脂

TA貢獻1836條經驗 獲得超3個贊

在您的代碼中,您正在使用一個無緩沖的通道,該通道會阻塞直到接收器接收到“一個”。在這種情況下,代碼不會超過 wg.Wait() 因為 wg.Done() 永遠不會被執行。


我想這就是你所追求的。


func main() {


c1 := make(chan string)

//var c1 chan string


go func() {

    fmt.Printf("go routine begin\n")

    time.Sleep(1 * time.Second)

    c1 <- "one"

    fmt.Printf("go routine done\n")

}()

fmt.Printf("done c1: %v\n", <-c1)

fmt.Printf("out\n")

}


查看完整回答
反對 回復 2022-05-23
  • 3 回答
  • 0 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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