Выбор ответа Middle sync и атомики спрашивают часто обновлено
wg.Add внутри горутины
Вопрос
Почему wg.Add(1) нельзя вызывать внутри запускаемой горутины?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Wait может пройти раньше, чем горутина вызовет Add. Горутина может стартовать позже, чем main дойдёт до Wait.
Варианты ответа
- Add можно вызывать только один раз, до первого запуска горутины
- Это всегда приводит к дедлоку: Wait и Add ждут друг друга
- Wait может пройти раньше, чем горутина вызовет Addправильный ответ
- Add внутри горутины не компилируется, WaitGroup это запрещает
Разбор
Горутина может стартовать позже, чем main дойдёт до Wait. Если счётчик в этот момент 0, Wait вернётся сразу. Поэтому Add вызывают до go. Add можно вызывать многократно и с любым положительным числом, дедлока не будет, просто ожидание сломается, и компилятор это не проверяет. В Go 1.25 появился wg.Go(f), который делает Add правильно сам.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «sync и атомики»
- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики