Где нужен atomic в счётчике активных запросов

Выполняйте Add(1), defer Add(-1) и Load через один atomic.Int64. Это защищает отдельный счётчик, но не делает атомарной группу проверок и изменений.

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

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

Выполняйте Add(1), defer Add(-1) и Load через один atomic.Int64. Это защищает отдельный счётчик, но не делает атомарной группу проверок и изменений.

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

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

Условие

Множество goroutines увеличивают inflight перед работой, уменьшают после и читают для метрик. Как использовать atomic.Int64 и чего это не гарантирует?

Ответ

Выполняйте Add(1), defer Add(-1) и Load через один atomic.Int64. Это защищает отдельный счётчик, но не делает атомарной группу проверок и изменений.

Не копируйте используемый atomic-объект. Проверка Load() < limit, за которой идёт Add, не гарантирует соблюдение лимита: два потока могут одновременно пройти её. Для резервирования используйте CAS-цикл или семафор. Если счётчик связан с map задач общим инвариантом, одного atomic для всей структуры недостаточно.

Источник: pkg.go.dev.

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

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

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

Подробнее