亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中關閉通道

在 Go 中關閉通道

Go
手掌心 2022-01-04 15:52:51
我正在學習 Go 中通道的工作方式,并偶然發現了關閉通道的問題。這是來自A Tour of Go的修改示例,它生成 n-1 斐波那契數并通過通道發送它們,使通道容量的最后一個“元素”未使用。func fibonacci(n int, c chan int) {    x, y := 0, 1    for i := 0; i < n-1; i++ {        c <- x        x, y = y, x+y    }    // close(c) // It's commented out on purpose}func main() {    n := 10    c := make(chan int, n)    go fibonacci(n, c)    for i := 0; i < n; i++ {        _, ok := <-c        fmt.Println(ok)    }}問題是我得到:致命錯誤:所有 goroutine 都處于睡眠狀態 - 死鎖!當我不關閉頻道時。究竟是什么導致了死鎖?當我不關閉它時,為什么我不能在其容量邊界內從通道接收?
查看完整描述

2 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

您正在將n 個值寫入通道(從 0 到n-1),但試圖從通道中讀取n+1 個值(從 0 到n)。如果沒有明確關閉通道,main函數將永遠等待最后一個值。

究竟是什么導致了死鎖?

之后?迭代,運行的夠程fibonacci功能將退出。在這個 goroutine 退出后,你程序中唯一剩下的 goroutine 就是maingoroutine,這個 goroutine 正在等待一些數據被寫入c通道——并且因為沒有其他 goroutine 可能會向這個通道寫入數據,它會永遠等待。這正是錯誤消息試圖告訴您的內容:“所有 goroutines(“all”只是“一個”,這里)都睡著了”。

函數中的_, ok := <- c調用main只會在c通道關閉后立即停止阻塞(因為從通道讀取是阻塞的,這需要從另一個 goroutine 中完成)。當通道關閉時,該main函數將從通道中讀取剩余數據(當它是緩沖通道時)


查看完整回答
反對 回復 2022-01-04
?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

主循環中的循環期望在通道中進行 n 次通信,但在 func fibonacci 中僅產生 n-1


func fibonacci(n int, c chan int) {

    x, y := 0, 1

    for i := 0; i < n; i++ { //here

        c <- x

        x, y = y, x+y


    }

    // close(c) // It's commented out on purpose

}

應該工作 http://play.golang.org/p/zdRuy14f9x


查看完整回答
反對 回復 2022-01-04
  • 2 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號