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

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

理解 golang 通道:死鎖

理解 golang 通道:死鎖

Go
jeck貓 2023-05-15 14:52:46
以下代碼:package mainimport (    "fmt"    "strings")var data = []string{    "The yellow fish swims slowly in the water",    "The brown dog barks loudly after a drink ...",    "The dark bird bird of prey lands on a small ...",}func main() {    histogram := make(map[string]int)    words := make(chan string)    for _, line := range data {        go func(l string) {            for _, w := range strings.Split(line, " ") {                words <- w            }        }(line)    }    defer close(words)    for w := range words {        histogram[w]++    }    fmt.Println(histogram)}以死鎖結束:fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan receive]:main.main()    /tmp/sandbox780076580/main.go:28 +0x1e0我的理解是通道詞會阻塞作者和讀者來達到某種同步。我正在嘗試為所有 goroutines(編寫器)使用單個通道,并在 main 中使用單個讀取器(使用“范圍”命令)。我也嘗試過緩沖通道 - 類似的失敗。我很難理解為什么這不起作用。有什么有助于理解的技巧嗎?
查看完整描述

1 回答

?
絕地無雙

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

延遲直到 main 返回才執行。結果,范圍words永遠阻塞。

要解決此問題,應用程序必須words在所有 goroutine 完成發送后關閉。一種方法是使用等待組。等待組為每個 goroutine 遞增,當 goroutines 退出時遞減。另一個 goroutine 在組上等待并關閉通道。

func main() {

? ? histogram := make(map[string]int)

? ? words := make(chan string)


? ? var wg sync.WaitGroup

? ? for _, line := range data {

? ? ? ? wg.Add(1)

? ? ? ? go func(l string) {

? ? ? ? ? ? for _, w := range strings.Split(l, " ") {

? ? ? ? ? ? ? ? words <- w

? ? ? ? ? ? }

? ? ? ? ? ? wg.Done()

? ? ? ? }(line)

? ? }


? ? go func() {

? ? ? ? wg.Wait()

? ? ? ? close(words)

? ? }()


? ? for w := range words {

? ? ? ? histogram[w]++

? ? }


? ? fmt.Println(histogram)

}

獎勵修復:問題中的 goroutine 引用了循環變量iine而不是參數l。




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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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