Intern
Kas nutiks, jei sync.WaitGroup skaitiklis taps neigiamas dėl papildomų Done iškvietimų, palyginti su Add?
sobes.tech AI
Atsakymas iš AI
Jei sync.WaitGroup skaitiklis Go kalboje tampa neigiamas dėl to, kad Done() iškvietimai yra daugiau nei Add(), vykdymo metu įvyks panika (panic).
WaitGroup stebi laukiančių gorutinių skaičių naudodamas skaitiklį. Kviečiant Add(n), skaitiklis padidėja n, o kviečiant Done() — sumažėja 1. Jei skaitiklis tampa mažesnis už nulį, tai laikoma naudojimo klaida.
Klaidos pavyzdys:
var wg sync.WaitGroup
wg.Add(1)
wg.Done()
wg.Done() // papildomas iškvietimas, sukels panic
Paniką sukelia pranešimas:
panic: sync: negative WaitGroup counter
Todėl svarbu griežtai palaikyti balansą tarp Add ir Done, kad išvengtumėte šios klaidos.