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