我正在學(xué)習(xí)頻道,下面是我嘗試過的測(cè)試,但發(fā)生了死鎖func main() { ch := make(chan int) go func() { select { case ch <- 1: fmt.Println("send suc") default: // if comment this line, it will run smoothly fmt.Println("default") } }() time.Sleep(2) // do some time consuming thing... fmt.Printf("receive val: %d", <-ch)}我預(yù)計(jì)沒有死鎖,但結(jié)果是:defaultfatal error: all goroutines are asleep - deadlock!但是如果我刪除defaultor time.Sleep(2),代碼將順利運(yùn)行,結(jié)果:send sucreceive val: 1有人可以解釋為什么會(huì)發(fā)生死鎖嗎?
1 回答

弒天下
TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
你有一個(gè)select
with default
,這意味著如果沒有任何通信操作準(zhǔn)備就緒,則select
不會(huì)等待,不會(huì)阻塞,而是default
立即執(zhí)行。通道是無緩沖的,所以它上面的發(fā)送還沒有準(zhǔn)備好(因?yàn)闆]有準(zhǔn)備好的接收器——main
正在休眠)。
因此,一旦 sleep 結(jié)束main
,它就會(huì)嘗試從通道接收,但到那時(shí)沒有人嘗試發(fā)送。僵局。
- 1 回答
- 0 關(guān)注
- 99 瀏覽
添加回答
舉報(bào)
0/150
提交
取消