#pragma once #include #include class AnalysisModel { int value = 0; int reader_count = 0; std::mutex model_mutex; std::mutex count_mutex; std::condition_variable no_writer; public: int read() { std::unique_lock count_lock(count_mutex); reader_count++; if(reader_count == 1) { model_mutex.lock(); } count_lock.unlock(); int result = value; count_lock.lock(); reader_count--; if(reader_count == 0) { model_mutex.unlock(); no_writer.notify_one(); } return result; } void write(int new_value) { std::unique_lock lock(model_mutex); value = new_value; no_writer.wait(lock, [this]() { return reader_count == 0; }); } };