为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 139 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信