【问题标题】:One barrier for multiple go routines多个围棋例程的一个障碍
【发布时间】:2018-10-07 16:27:39
【问题描述】:

我正在尝试使用 goroutine。

我有一个执行 x 次的 goroutine 函数,我想等待所有这些例程在我的 main 函数中继续。我尝试使用 chan 作为屏障。

我尝试过类似的方法:

func goroutine(i int, ch []chan bool) {
    //do stuff
    ch[i] <- true
}

func main() {
    var ch []chan bool
    for i := 0; i < nb; i++ {
        ch[i] = make(chan bool)
        go goroutine(i, ch)
    }

    // wait to continue
    for i := 0; i < nb; i++ {
         <- ch[i]
    }
}

我有以下错误:panic: runtime error: index out of range 表示ch[i] = make(chan bool)

第一个问题:

  • 是使用 chan 的好方法吗?

第二个问题:

  • 为什么会出现此索引超出范围错误?

【问题讨论】:

  • 你永远不会分配ch。通常,尽管为此只使用sync.WaitGroup。也许在 Tour Of Go 部分末尾关于并发的一些链接会有所帮助:tour.golang.org/concurrency/11

标签: go goroutine barrier


【解决方案1】:

如果您只想等待 goroutine 完成并且不需要通过通道返回结果,那么sync.WaitGroup 将是一个更简洁的解决方案。可行的方法是:

  • 创建一个 WaitGroup wg 并在您启动 goroutine 时调用 wg.Add(1) 并将指向 wg 的指针传递给 goroutine。
  • 在goroutine中,在返回之前调用wg.Done()
  • 要等待所有 goroutine 完成,请调用 wg.Wait()

【讨论】:

  • 谢谢。我刚刚阅读了有关 sync.WaitGroup 的文档。这是我将使用的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多