#include<thread>
#include<cstdio>
#include<mutex>
#include<list>
#include<condition_variable>
#include<memory>
#include<chrono>
class Queue{
private:
std::list<int> data_queue_;
std::condition_variable cond_;
mutable std::mutex mutex_;
public:
void pop(int &e){
std::unique_lock<std::mutex> lk(mutex_);
cond_.wait(lk,[this](){return !data_queue_.empty();});
e = data_queue_.front();
data_queue_.pop_front();
return ;
}
void push(int e){
std::lock_guard<std::mutex> lk(mutex_);
data_queue_.push_back(e);
cond_.notify_all();
}
};
Queue queue;
void thread1(){
for(int i = 0;i<10;i++){
queue.push(i);
printf("creater created %d\n",i);
std::this_thread::sleep_for(std::chrono::seconds(2));
}
}
void thread2(){
int e;
for(int i =0;i<10;i++){
queue.pop(e);
printf("consumer get %d\n",e);
}
}
int main(){
std::thread th1(thread1);
std::thread th2(thread2);
th1.join();
th2.join();
return 0;
}