首页 > 解决方案 > 多个围棋例程的一个障碍

问题描述

我正在尝试使用 goroutines。

我有一个执行 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)

第一个问题:

第二个问题:

标签: gogoroutinebarrier

解决方案


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

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

推荐阅读