Выбор ответа Junior sync и атомики спрашивают часто обновлено

Гонка на счётчике из горутин

Вопрос

1000 горутин делают counter++ над общей переменной типа int, main ждёт их через WaitGroup. Что будет в counter?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Не определено, часто меньше 1000: инкременты теряются. Это гонка данных: операции горутин перекрываются, и часть инкрементов теряется.

Варианты ответа

  1. Не определено, часто меньше 1000: инкременты теряютсяправильный ответ
  2. Ровно 1000: инкремент int на amd64 атомарен
  3. Ровно 1000, потому что WaitGroup синхронизирует доступ
  4. Программа не скомпилируется: гонку видит компилятор

Разбор

Это гонка данных: операции горутин перекрываются, и часть инкрементов теряется. Атомарность обычных операций Go не гарантирует. WaitGroup только ждёт завершения, но не защищает доступ к переменной. Компилятор гонки не видит, их ловит -race. Исправление: atomic.Int64 или мьютекс.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.