Пара total/count обновляется атомиками по отдельности, и среднее «прыгает». Реализуйте Metrics: Record и Average — оба под одним мьютексом.
- Задача
- Решение
- Обсуждение
Metrics: инвариант пары под мьютексом
GolangРешение
func (m *Metrics) Record(x int64) {
m.mu.Lock()
defer m.mu.Unlock()
m.total += x
m.count++
}
func (m *Metrics) Average() int64 {
m.mu.Lock()
defer m.mu.Unlock()
if m.count == 0 {
return 0
}
return m.total / m.count
}