Sobes.tech
Junior — Middle

Go-ში სინქრონიზაციის კონტექსტში, wg.Add-ის გამოყენება ციკლში და მის გამოყენებას ციკლამდე შორის რა განსხვავებაა?

sobes.tech AI

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