Sobes.tech
Intern

Co się stanie, jeśli licznik sync.WaitGroup stanie się ujemny z powodu dodatkowych wywołań Done w porównaniu do Add?

sobes.tech AI

Odpowiedź od AI

Jeśli licznik sync.WaitGroup w Go stanie się ujemny z powodu większej liczby wywołań Done() niż Add(), w czasie działania wystąpi panic.

WaitGroup śledzi liczbę oczekujących gorutyn za pomocą licznika. Wywołanie Add(n) zwiększa licznik o n, a Done() — zmniejsza go o 1. Jeśli licznik spadnie poniżej zera, jest to uważane za błąd użytkowania.

Przykład błędu:

var wg sync.WaitGroup
wg.Add(1)
wg.Done()
wg.Done() // dodatkowe wywołanie, spowoduje panic

Panic pojawia się z komunikatem:

panic: sync: negative WaitGroup counter

Dlatego ważne jest, aby ściśle zachować równowagę między Add a Done, aby uniknąć tego błędu.