Выбор ответа Junior sync и атомики спрашивают часто обновлено
Гонка на счётчике из горутин
Вопрос
1000 горутин делают counter++ над общей переменной типа int, main ждёт их через WaitGroup. Что будет в counter?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Не определено, часто меньше 1000: инкременты теряются. Это гонка данных: операции горутин перекрываются, и часть инкрементов теряется.
Варианты ответа
- Не определено, часто меньше 1000: инкременты теряютсяправильный ответ
- Ровно 1000: инкремент int на amd64 атомарен
- Ровно 1000, потому что WaitGroup синхронизирует доступ
- Программа не скомпилируется: гонку видит компилятор
Разбор
Это гонка данных: операции горутин перекрываются, и часть инкрементов теряется. Атомарность обычных операций Go не гарантирует. WaitGroup только ждёт завершения, но не защищает доступ к переменной. Компилятор гонки не видит, их ловит -race. Исправление: atomic.Int64 или мьютекс.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «sync и атомики»
- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики