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

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

如何在不產生死鎖的情況下擁有一個緩沖通道和多個讀取器?

如何在不產生死鎖的情況下擁有一個緩沖通道和多個讀取器?

Go
HUWWW 2021-12-20 09:44:37
致命錯誤 所有 go 例程都處于休眠狀態。僵局。這是我嘗試過的。我在打電話wg.Done()。缺什么?package mainimport (    "fmt"    "strconv"    "sync")func sender(wg *sync.WaitGroup, cs chan int) {    defer wg.Done()    for i := 0; i < 2; i++ {        fmt.Println(i)        cs <- i    }}func reciever(wg *sync.WaitGroup, cs chan int) {    x, ok := <-cs    for ok {        fmt.Println("Retrieved" + strconv.Itoa(x))        x, ok = <-cs        if !ok {            wg.Done()            break        }    }}func main() {    wg := &sync.WaitGroup{}    cs := make(chan int, 1000)    wg.Add(1)    go sender(wg, cs)    for i := 1; i < 30; i++ {        wg.Add(1)        go reciever(wg, cs)    }    wg.Wait()    close(cs)}
查看完整描述

2 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

您應該先關閉頻道wg.Wait。
您所有的接收器都在等待來自通道的數據。這就是你陷入僵局的原因。
您可以在函數defer聲明中關閉通道sender。如果第一次嘗試從頻道接收失?。ㄒ驗轭l道已經關閉),
您還需要wg.Done()

http://play.golang.org/p/qdEIEFY-kl


查看完整回答
反對 回復 2021-12-20
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

有幾件事:

  1. 發送完成后,您需要關閉頻道。

  2. 在接收器中,跨通道范圍

  3. 不需要在等待組中添加 1 并在發送者中調用 Done

請參考http://play.golang.org/p/vz39RY6WA7



查看完整回答
反對 回復 2021-12-20
  • 2 回答
  • 0 關注
  • 172 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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