По порядку Junior sync и атомики обновлено
Как найти и исправить гонку данных
Вопрос
Расставьте шаги работы с подозрением на гонку данных.
Попробуйте сами
Расставьте шаги по порядку стрелками.
- 1Добавить синхронизацию: мьютекс, атомик или канал
- 2Написать тест, который нагружает код из нескольких горутин
- 3Запустить
go test -race - 4Повторно прогнать тест с -race и включить флаг в CI
- 5Изучить отчёт: два стека с конфликтующими доступами
Показать ответ и разбор
Коротко
Детектор находит только гонки, которые реально случились, поэтому сначала нужен код, который их провоцирует. Отчёт показывает обе стороны конфликта, по ним выбирают способ синхронизации, а прогон в CI не даёт регрессии.
Правильный порядок
- 1Написать тест, который нагружает код из нескольких горутин
- 2Запустить
go test -race - 3Изучить отчёт: два стека с конфликтующими доступами
- 4Добавить синхронизацию: мьютекс, атомик или канал
- 5Повторно прогнать тест с -race и включить флаг в CI
Разбор
Детектор находит только гонки, которые реально случились, поэтому сначала нужен код, который их провоцирует. Отчёт показывает обе стороны конфликта, по ним выбирают способ синхронизации, а прогон в CI не даёт регрессии.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «sync и атомики»
- Глобальный максимум через CompareAndSwap
- Конкурентные переводы между счетами без дедлока
- Шардированная мапа с мьютексом на шард
- Что выведет Go: atomic.Int64 из 100 горутин
- Что выведет Go: sync.Once и OnceValue
- Код-ревью Go: кеш на RWMutex
- Код-ревью Go: ленивый синглтон и горячая перезагрузка конфига
- Типизированные атомики