Consider the following sketch of a thread-safe StreamingAverage class. There is a bug here; can you find it?
class StreamingAverage {
double m_sum = 0;
int m_count = 0;
double m_last_average = 0;
std::mutex m_mtx;
public:
// Called from the single producer thread
void add_value(double x) {
std::lock_guard lk(m_mtx);
m_sum += x;
m_count += 1; // A
}
// Called from the single consumer thread
double get_current_average() {
std::lock_guard lk(m_mtx);
m_last_average = m_sum / m_count; // B
return m_last_average;
}
// Called from the single consumer thread
double get_last_average() const {
return m_last_average; // C
}
// Called from the single consumer thread
double get_current_count() const {
return...