Go語言裡channel的死鎖

2021-06-21 10:26:43 字數 821 閱讀 1552

最近看了下go語言並寫了些示例**,在用到channel的時候報了個奇怪的錯誤然後退出:

"fatal error: all goroutines are asleep - deadlock!"

在stackoverflow上搜到:

查了查,出錯的**如下:

func chanfunc(c chan int, d chan int) 

} else

case v, ok := <- d:

if ok

} else }}

}

c := make(chan int)

d := make(chan int)

//c <- 1

go chanfunc(c, d)

//write to channel

c <- 1

d <- 2

cv := <- c

dv := <- d

fmt.printf("cv = %d\n", cv)

fmt.printf("dv = %d\n", dv)

在chanfunc函式中如果管道c收到資料的話就會馬上將其返回,但此時主線程(暫且這麼稱呼)中在向管道d傳送資料,結果就是:

1 主線程在等管道d

2 chanfunc在等管道c

3 c在等主線程接收

然後整個程式死鎖,導致退出。

程式中死鎖是常見的錯誤,不過採取直接退出的方式還是第一次碰到過,大概是《unix程式設計藝術》中所說的那樣:「出現異常時,馬上退出並給出足夠錯誤資訊」。

Go語言學習日誌之channel引發死鎖問題

今天在看到go中的channel時,就自己動手試了一下這個資料結構,先貼原始 package main import fmt time func main 乍一看沒毛病,但就是這麼簡單的乙個測試執行就直接報錯了 fatal error all goroutines are asleep deadlo...

go語言 channel特點

通道擁有阻塞機制 無緩衝區 有緩衝區同理。接收端在傳送端資料傳送完成之前 通道為nil 處於阻塞狀態 傳送端在接收端資料拿走完成之前 通道為滿 處於阻塞態 1.struct 型別不佔空間,作為通道的一種訊號方式 2.chan型別為引用型別,故需要進行初始化,申請空間,在通道使用結束後close 關閉...

go 通道 go語言通道channel

通過使用通道,在多個goroutine傳送和接受共享的資料,達到資料同步的目的。通道,他有點像在兩個routine之間架設的管道,乙個goroutine可以往這個管道裡塞資料,另外乙個可以從這個管道裡取資料,有點類似於我們說的佇列。宣告乙個通道很簡單,我們使用chan關鍵字即可,除此之外,還要指定通...