Sobes.tech
Junior — Middle

Wat is het verschil tussen het gebruik van wg.Add binnen een lus en het gebruik ervan vóór de lus in de context van synchronisatie in Go?

sobes.tech AI

Antwoord van AI

В Go wg.Add увеличивает счетчик ожидания WaitGroup. Разница между вызовом wg.Add внутри цикла и перед циклом:

  • Вызов wg.Add перед циклом: счетчик увеличивается один раз на общее количество горутин, которые будут запущены. Это безопасно и рекомендуется, так как счетчик устанавливается заранее.
wg.Add(3) // заранее увеличиваем счетчик
for i := 0; i < 3; i++ {
    go func() {
        defer wg.Done()
        // работа
    }()
}
wg.Wait()
  • Вызов wg.Add внутри цикла: счетчик увеличивается в каждой итерации, что тоже работает, но может привести к гонкам, если горутины запускаются асинхронно и вызывают Done до того, как Add был вызван для всех.
for i := 0; i < 3; i++ {
    wg.Add(1) // увеличиваем счетчик в цикле
    go func() {
        defer wg.Done()
        // работа
    }()
}
wg.Wait()

Рекомендация: лучше вызывать wg.Add до запуска горутин, чтобы избежать потенциальных проблем с синхронизацией.