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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

當(dāng)向 Go 例程之外的通道發(fā)送值時(shí),Go 例程會(huì)出現(xiàn)死鎖

當(dāng)向 Go 例程之外的通道發(fā)送值時(shí),Go 例程會(huì)出現(xiàn)死鎖

Go
慕田峪7331174 2023-07-04 19:05:56
我在 Golang 教程中學(xué)習(xí) Go select 語(yǔ)句時(shí)嘗試對(duì)代碼進(jìn)行一些更改: https: //tour.golang.org/concurrency/5。但是,我遇到了問(wèn)題:fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan send]:main.main()        concurrency.go:26 +0xa3goroutine 33 [chan receive]:main.main.func1(0xc000088000)        concurrency.go:24 +0x42created by main.main        concurrency.go:23 +0x89exit status 2這是我嘗試并遇到問(wèn)題的代碼func fibonacci(c, quit chan int) {    x, y := 0, 1    for {        select {            case c <- x:  //sending value x into channel c                x, y = y, x+y            case <-quit:    //receive value from quit                fmt.Println("quit")        return        }    }}func main() {    //create two channels    c := make(chan int)    quit := make(chan int)    go func() { //spin off the second function in order to let consume from c , so fibonaci can continue to work        fmt.Println(<-c)    //read value from channel c    }()    //Try moving the statement that send value to channel quit in order to     //return function fibonacci    quit <- 0       fibonacci(c, quit)}起初,我認(rèn)為結(jié)果將與下面代碼的結(jié)果相同//function fibonacci is same with the first onefunc fibonacci(c, quit chan int) {    x, y := 0, 1    for {        select {            case c <- x:  //sending value x into channel c                x, y = y, x+y            case <-quit:    //receive value from quit                fmt.Println("quit")        return        }    }}func main() {    //create two channels    c := make(chan int)    quit := make(chan int)    go func() { //spin off the second function in order to let consume from c , so fibonaci can continue to work        fmt.Println(<-c)    //read value from channel c        quit <- 0 //CHANGE: move the statement inside the closure function     }()    fibonacci(c, quit)}輸出是0quit您能解釋一下執(zhí)行第一個(gè)示例時(shí)死鎖的根本原因是什么嗎?在go例程中發(fā)送值退出通道與在主線程中發(fā)送值退出通道有什么區(qū)別?感謝你們。
查看完整描述

1 回答

?
寶慕林4294392

TA貢獻(xiàn)2021條經(jīng)驗(yàn) 獲得超8個(gè)贊

該quit通道是無(wú)緩沖通道。在發(fā)送和接收 goroutine 都準(zhǔn)備好之前,無(wú)緩沖通道上的通信不會(huì)繼續(xù)。該語(yǔ)句quit <- 0在應(yīng)用程序執(zhí)行函數(shù)以接收值之前阻塞。接收 Goroutine 永遠(yuǎn)不會(huì)準(zhǔn)備好


通過(guò)關(guān)閉通道修復(fù):


c := make(chan int)

quit := make(chan int)

go func() {

    fmt.Println(<-c)

}()

close(quit)

fibonacci(c, quit)

...或者通過(guò)緩沖通道


c := make(chan int, 1) // <- note size 1

quit := make(chan int)

go func() { 

    fmt.Println(<-c) 

}()

quit <- 0   

fibonacci(c, quit)

在這種情況下,fibonacci將在產(chǎn)生值之前退出。


查看完整回答
反對(duì) 回復(fù) 2023-07-04
  • 1 回答
  • 0 關(guān)注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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