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