天天看點

Go語言管道的使用-死鎖情況

管道分為帶緩存的和不帶緩存的

帶緩存的,make的時候指定大小,且管道未關閉狀态,如果一直取不到值,發生錯誤

func main() {
    chan1 := make(chan int)
    chan2 := make(chan int)
    go func() {
        chan2 <- 1
        chan1 <- 2
    }()
    <- chan1 
}
           

fatal error: all goroutines are asleep - deadlock!

一直等待,chan2,發生死鎖

func main() {
    ch := make(chan int)
    ch <- 1
}
           
func main() {
    ch := make(chan int)
    <-ch
}
           

無緩沖管道不存儲值,無論是傳值還是取值都會阻塞。這裡隻有一個主程的情況下,

第一段代碼是阻塞在傳值,

第二段代碼是阻塞在取值。

一直卡住主協程,系統一直在等待,是以系統判斷為死鎖,最終報deadlock錯誤并結束程式。

func main() {
	chan1 := make(chan int, 2)
	chan1 <- 1
	chan1 <- 2
	for ch := range chan1 {
		fmt.Println(ch)
	}
}
           

 也會發生死鎖,如果管道全部取完後,在去取,相當于沒有緩存的管道了,一直等待。

綜上所訴:

  1. 全部取出的管道,再取會出現死鎖
  2. 已經塞滿的管道,在塞也會死鎖