Sobes.tech
Junior — Middle

Каква е разликата между използването на wg.Add вътре в цикъл и преди цикъла в контекста на синхронизация в Go?

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 преди стартирането на горутините, за да избегнете потенциални проблеми със синхронизация.