Выполняйте Add(1), defer Add(-1) и Load через один atomic.Int64. Это защищает отдельный счётчик, но не делает атомарной группу проверок и изменений.
Где нужен atomic в счётчике активных запросов
Выполняйте 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.