Sobes.tech
Junior — Middle

Kuo skiriasi wg.Add naudojimas ciklo viduje nuo jo taikymo prieš ciklą Go sinchronizacijos kontekste?

sobes.tech AI

Atsakymas iš AI

Go kalboje wg.Add padidina WaitGroup laukimo skaitiklį. Skirtumas tarp wg.Add iškvietimo ciklo viduje ir prieš jį:

  • Iškvietus wg.Add prieš ciklą: skaitiklis padidinamas vieną kartą bendrai paleidžiamų gorutinių skaičiui. Tai saugu ir rekomenduojama, nes skaitiklis iš anksto nustatomas.
wg.Add(3) // iš anksto padidiname skaitiklį
for i := 0; i < 3; i++ {
    go func() {
        defer wg.Done()
        // darbas
    }()
}
wg.Wait()
  • Iškvietus wg.Add ciklo viduje: skaitiklis didėja kiekvienos iteracijos metu, tai taip pat veikia, bet gali sukelti lenktynių sąlygas, jei gorutinos paleidžiamos asinchroniškai ir kviečia Done prieš Add iškvietimą visoms.
for i := 0; i < 3; i++ {
    wg.Add(1) // didiname skaitiklį ciklo metu
    go func() {
        defer wg.Done()
        // darbas
    }()
}
wg.Wait()

Rekomendacija: geriau iškviesti wg.Add prieš paleidžiant gorutinas, kad išvengtumėte galimų sinchronizacijos problemų.