2 回答

TA貢獻(xiàn)1836條經(jīng)驗 獲得超13個贊
如果緩沖區(qū)中有空間,則寫入緩沖通道不會阻塞。
如果您嘗試將緩沖區(qū)大小為 1 的兩個項目放入通道中,則會出現(xiàn)相同的錯誤:
package main
func main() {
c := make(chan int, 1)
c <- 3
c <- 4
}
給你:
fatal error: all goroutines are asleep - deadlock!

TA貢獻(xiàn)1859條經(jīng)驗 獲得超6個贊
這是 Go 通道(或其他CSP實現(xiàn),如 Clojure 的core.async庫)的核心概念,它們被阻塞。一般來說,正如您已經(jīng)提到的,有兩種類型的渠道:
如果緩沖區(qū)已滿,則緩沖哪個塊。
如果沒有“集合點(diǎn)”,則無緩沖哪個塊,即必須有人將 ( c <-)放入<- c頻道,有人從頻道中取出 ( )。
在您的特定情況下,Go 運(yùn)行時足夠智能,可以檢測到?jīng)]有人會3從 channel 中獲取c。因此,這是一個死鎖,并且(謝天謝地)拋出了一個錯誤。
當(dāng)你使用通道時,你通常做的是使用goroutines(查看這個介紹),它產(chǎn)生一個輕量級線程——由 Go 運(yùn)行時管理——來并發(fā)執(zhí)行主體:
c := make(chan int)
go func() { c <- 3 }() // Create a new gorountine that puts 3 to the channel
fmt.Println(<- c) // Take 3 from the channel and print it in the main thread
- 2 回答
- 0 關(guān)注
- 216 瀏覽
添加回答
舉報