Наличие отрицательного счетчика waitGroup, но почему - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь понять go подпрограммы и поигрался с некоторым кодом. Это действительно заставляет меня задуматься. Он печатает два или более значений, а затем выдает ошибку

pani c: syn c: отрицательный счетчик WaitGroup

func processTheInt(i int, wg sync.WaitGroup){
    fmt.Println(i)
    wg.Done()

}


func main(){
    var waitGroup sync.WaitGroup

    for {
        theInt := rand.Intn(100)
        waitGroup.Add(1)
        go processTheInt(theInt, waitGroup)
    }

}

Может кто-нибудь объяснить, почему это это происходит? Перед выполнением go fun c processTheInt я увеличиваю счетчик. Функция выполняется и уменьшается после печати. Это потому, что печать занимает больше времени, чем отключение функции?

1 Ответ

4 голосов
/ 16 апреля 2020

Вы должны передать указатель на переменную waitGroup

func processTheInt(i int, wg *sync.WaitGroup){
    fmt.Println(i)
    wg.Done()

}

func main(){
    var waitGroup sync.WaitGroup

    for {
        theInt := rand.Intn(100)
        waitGroup.Add(1)
        go processTheInt(theInt, &waitGroup)
    }

}

В противном случае он будет копировать структуру при каждой итерации.

Read this to know the difference

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...