Sobes.tech
Назад к вопросам
Junior — Middle
78

Чем отличается использование wg.Add внутри цикла от его применения перед циклом в контексте синхронизации в Go?

Компании, где спрашивали
Кредиска

Ответ от нейросети

sobes.tech 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 до запуска горутин, чтобы избежать потенциальных проблем с синхронизацией.