我正在學習頻道,下面是我嘗試過的測驗,但發生了死鎖
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)
}
我預計沒有死鎖,但結果是:
default
fatal error: all goroutines are asleep - deadlock!
但是如果我洗掉defaultor time.Sleep(2),代碼將順利運行,結果:
send suc
receive val: 1
有人可以解釋為什么會發生死鎖嗎?
uj5u.com熱心網友回復:
你有一個selectwith default,這意味著如果沒有任何通信操作準備就緒,select 則不會等待,不會阻塞,而是default立即執行。通道是無緩沖的,所以它上面的發送還沒有準備好(因為沒有準備好的接收器——main正在休眠)。
因此,一旦 sleep 結束main,它就會嘗試從通道接收,但到那時沒有人嘗試發送。僵局。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535741.html
標籤:去僵局渠道
