#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
using namespace std;
mutex mtx;
condition_variable cv_producer, cv_consumer;
queue<int> q;
void producer() {
int i = 5;
while(1){
++i;
unique_lock<mutex> lock(mtx);
cv_producer.wait(lock, []{ return q.size() < 10; });
q.push(i);
cout << "Produced " << i << endl;
lock.unlock();
cv_consumer.notify_all();
}
}
void consumer() {
while (true) {
unique_lock<mutex> lock(mtx);
cv_consumer.wait(lock, []{ return !q.empty(); });
int val = q.front();
q.pop();
cout << "Consumed " << val << endl;
lock.unlock();
cv_producer.notify_all();
}
}
int main() {
thread t1(producer);
thread t2(producer);
thread t3(consumer);
t1.join();
t2.join();
t3.join();
return 0;
}