Один барьер для многократных тренировок - PullRequest
0 голосов
/ 27 апреля 2018

Я экспериментирую с процедурами го.

У меня есть функция подпрограммы go, выполненная x раз, и я хочу дождаться продолжения всех этих подпрограмм в моей основной функции. Я пытаюсь использовать Чан для барьера.

Я попробовал что-то подобное:

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)

Первый вопрос:

  • хорошее решение для использования чана?

Второй вопрос:

  • Почему этот индекс выходит за пределы допустимого диапазона?

1 Ответ

0 голосов
/ 27 апреля 2018

Если вы просто хотите дождаться завершения выполнения процедур и вам не нужно возвращать результат по каналу, тогда sync.WaitGroup будет более чистым решением. Вот как это будет работать:

  • Создайте wg WaitGroup и всякий раз, когда вы запускаете вызов программы, wg.Add(1) и передаете указатель на wg в программу.
  • В горутине, перед ответным звонком wg.Done()
  • Чтобы дождаться окончания всех процедур, позвоните wg.Wait()
...