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

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

具有多個通道的多個 goroutine 的死鎖

具有多個通道的多個 goroutine 的死鎖

Go
翻閱古今 2023-05-08 14:27:31
我正在開發一個示例程序,使用具有多個通道的 goroutine 打印 1 到 100 之間的奇數和和偶數和。你可以找到我的代碼這里輸出sum of even number = 2550sum of odd number = 2500fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.print(0x434100, 0x11db7c)    /tmp/sandbox052575152/main.go:18 +0xc0main.main()    /tmp/sandbox052575152/main.go:14 +0x120該代碼有效但存在死鎖。我不確定我的代碼有什么問題
查看完整描述

1 回答

?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

我們可以遍歷通過通道發送的值。要打破這種迭代通道,需要明確關閉。否則 range 將以與 nil 通道相同的方式永遠阻塞。在您的代碼中,您沒有關閉sum(打印功能sumValues通道)通道。這就是為什么以下功能將永遠被阻止的原因。


func print(sumValues <-chan string ){

    for val := range sumValues {

        fmt.Println(val)

    }

}

所以你必須在函數sum中的doSum所有 go 例程doSum完成后關閉函數中的通道(否則sum通道可能會在 go 例程完成之前關閉)。你可以用sync.WaitGroup它來做到這一點。請參閱下面的更新doSum功能:


func doSum(sum chan<- string, oddChan <-chan int, evenChan <-chan int) {

    var waitGroup sync.WaitGroup


    waitGroup.Add(2) // Must wait for 2 calls to 'done' before moving on


    go func(sum chan<- string) {

        s1 := 0

        for val := range oddChan {

            s1 += val

        }

        sum <- fmt.Sprint("sum of odd number = ", s1)

        waitGroup.Done()

    }(sum)


    go func(sum chan<- string) {

        s1 := 0

        for val := range evenChan {

            s1 += val

        }

        sum <- fmt.Sprint("sum of even number = ", s1)

        waitGroup.Done()

    }(sum)


    // Waiting for all goroutines to exit

    waitGroup.Wait()


    // all goroutines are complete now close the sum channel

    close(sum)

}


查看完整回答
反對 回復 2023-05-08
  • 1 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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