#include #include #include #include #include #include int main() { std::mutex mutex; std::condition_variable changed; std::queue queue; bool closed = false; std::thread producer([&] { for (int value = 1; value <= 3; ++value) { { std::lock_guard lock(mutex); queue.push(value); } changed.notify_one(); } { std::lock_guard lock(mutex); closed = true; } changed.notify_all(); }); int sum = 0; for (;;) { std::unique_lock lock(mutex); changed.wait(lock, [&] { return closed || !queue.empty(); }); if (queue.empty()) break; const int value = queue.front(); queue.pop(); lock.unlock(); sum += value; } producer.join(); assert(sum == 6); assert(queue.empty() && closed); std::cout << sum << '\n'; }