Как устранить гонку при увеличении общего счётчика

WaitGroup ждёт завершения, но не защищает read-modify-write. Используйте mutex вокруг инкремента или атомарное увеличение, а также согласованное чтение.

Короткий ответ

Что ответить на собеседовании

WaitGroup ждёт завершения, но не защищает read-modify-write. Используйте mutex вокруг инкремента или атомарное увеличение, а также согласованное чтение.

Подробный разбор

Ответ с пояснениями

Условие

Две goroutines Go выполняют count++ над общей переменной, main читает результат после ожидания. Почему одного WaitGroup недостаточно и как исправить?

Ответ

WaitGroup ждёт завершения, но не защищает read-modify-write. Используйте mutex вокруг инкремента или атомарное увеличение, а также согласованное чтение.

Count++ состоит из чтения, изменения и записи, поэтому обновления могут потеряться. Для независимого счётчика подходит atomic.Int64; для нескольких связанных полей удобнее mutex. Проверяйте гонки соответствующим инструментом, но отсутствие обнаруженной гонки в одном запуске не является доказательством корректности всех путей.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее