多个例程的一个障碍

时间:2018-04-26 21:20:50

标签: go goroutine barrier

我正在尝试go例程。

我有一个执行x次的go例程函数,我想等待所有这些例程在我的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行<{1}}

第一个问题:

  • 是使用陈的好方法吗?

第二个问题:

  • 为什么我的索引超出范围错误?

1 个答案:

答案 0 :(得分:1)

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

  • 创建一个WaitGroup wg,每当你开始一个goroutine调用wg.Add(1)并将一个指向wg的指针传递给goroutine。
  • 在goroutine中,在回复wg.Done()
  • 之前
  • 要等待所有goroutine完成,请致电wg.Wait()