第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在 Go 中關(guān)閉通道

在 Go 中關(guān)閉通道

Go
手掌心 2022-01-04 15:52:51
我正在學(xué)習(xí) Go 中通道的工作方式,并偶然發(fā)現(xiàn)了關(guān)閉通道的問題。這是來自A Tour of Go的修改示例,它生成 n-1 斐波那契數(shù)并通過通道發(fā)送它們,使通道容量的最后一個“元素”未使用。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 都處于睡眠狀態(tài) - 死鎖!當(dāng)我不關(guān)閉頻道時(shí)。究竟是什么導(dǎo)致了死鎖?當(dāng)我不關(guān)閉它時(shí),為什么我不能在其容量邊界內(nèi)從通道接收?
查看完整描述

2 回答

?
千巷貓影

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個贊

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

究竟是什么導(dǎo)致了死鎖?

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

函數(shù)中的_, ok := <- c調(diào)用main只會在c通道關(guān)閉后立即停止阻塞(因?yàn)閺耐ǖ雷x取是阻塞的,這需要從另一個 goroutine 中完成)。當(dāng)通道關(guān)閉時(shí),該main函數(shù)將從通道中讀取剩余數(shù)據(jù)(當(dāng)它是緩沖通道時(shí))


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

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個贊

主循環(huán)中的循環(huán)期望在通道中進(jìn)行 n 次通信,但在 func fibonacci 中僅產(chǎn)生 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

}

應(yīng)該工作 http://play.golang.org/p/zdRuy14f9x


查看完整回答
反對 回復(fù) 2022-01-04
  • 2 回答
  • 0 關(guān)注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號