Sobes.tech
Junior — Middle

Quelle est la différence entre l'utilisation de wg.Add à l'intérieur d'une boucle et son utilisation avant la boucle dans le contexte de la synchronisation en Go?

sobes.tech IA

Réponse de l'IA

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