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

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

chans 和 waitgroups 的問題

chans 和 waitgroups 的問題

Go
素胚勾勒不出你 2022-06-13 15:55:16
雖然我看到過類似的問題,但在 SO 上找到的答案都沒有幫助我,但我希望有鷹眼的善良靈魂可以幫助我在這里查明問題。我知道這不是 goroutines 的最佳用途,但我想以這種方式作為練習,但顯然失敗了。我的代碼package mainimport (    "fmt"    "sort"    "sync")func main() {    X := []int{1, 2, 3, 4, 0}    Y := []int{2, 3, 6, 8, 4}    solution := Solution(X, Y)    fmt.Println(solution)}//Solution solutionfunc Solution(X []int, Y []int) int {    size := len(X)    resultChan := make(chan int)    results := make(map[int]int)    ParseDivision(size, X, Y, resultChan)    for val := range resultChan {        results[val] = results[val] + 1    }    close(resultChan)    return FindGreatest(results)}//Divide dividefunc Divide(a int, b int, resultChan chan<- int, wg *sync.WaitGroup) {    defer wg.Done()    result := float64(a) / float64(b)    resultChan <- int(result * 1000)}//FindGreatest find greatest in mapfunc FindGreatest(myMap map[int]int) int {    values := make([]int, 0, len(myMap))    for _, val := range myMap {        values = append(values, val)    }    sort.Ints(values)    return values[len(values)-1]}//ParseDivision intfunc ParseDivision(lenth int, X []int, Y []int, resultChan chan<- int) {    var wg sync.WaitGroup    wg.Add(lenth)    for i := 0; i < lenth; i++ {        go Divide(X[i], Y[i], resultChan, &wg)    }    wg.Wait()}結果:fatal error: all goroutines are asleep - deadlock!我完全不確定為什么我已經遵循了一些示例以及 SO 的答案,關于通過引用傳遞 waitGroup 以及使用通道來獲取在 goroutine 中執行的操作的結果。
查看完整描述

1 回答

?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

需要注意的一些事項:

  • 寫入通道的 go-routine 通常應該關閉通道;

  • 從上面開始,“閱讀器” go-routine 應該等待通道關閉(通過范圍等) - 即它永遠不必關閉其讀取的通道。

  • 由于您的結果通道是無緩沖的(緩沖區大小為 0),主 go-routine 阻塞等待工作人員嘗試寫入,并且主要 go-routine 尚未(尚未)從結果通道讀?。ㄗ鳛槌毓芾砥?go-必須完成例程才能發生這種情況 - 死鎖?。?。解決方案:

    • 確保工作池 go-routine 獨立于主(閱讀器)go-routine 運行。

3 行修復: https: //play.golang.org/p/9hYuyDgMjGi


查看完整回答
反對 回復 2022-06-13
  • 1 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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