#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
#include<queue>
using namespace std;
class Queue{
public:
void put(int val)
{
unique_lock<mutex> lock(_queMtx);
while(!_que.empty())
{
//队列不为空,应当阻塞生产线程,通知消费线程去消费
/*
#1 生产者线程进入等待状态
#2 把_queMtx互斥锁解开,
此处必须使用unique_lock,不能使用lock_guard,因为lock_guard不能作为参数进行传递
*/
cv.wait(lock);
}
//队列为空,生产
_que.push(val);
//生产者生产完毕,通知所有消费者进行消费
cv.notify_all();
cout<<"生产者 生产"<<val<<"号物品!"<<endl;
}
void get()
{
unique_lock<mutex> lock(_queMtx);
while(_que.empty())
{
//队列为空。消费者阻塞当前线程,并通知生产者生产
/*
#1 消费者线程进入等待状态
#2 把_queMtx互斥锁解开,
此处必须使用unique_lock,不能使用lock_guard,因为lock_guard不能作为参数进行传递
*/
cv.wait(lock);
}
//队列不为空,进行消费
int val=_que.front();
_que.pop();
//消费完毕,通知生产者进行生产
cv.notify_all();
cout<<"消费者 消费"<<val<<"号物品"<<endl;
}
private:
queue<int> _que;
mutex _queMtx;
condition_variable cv;
};
void produce(Queue* que)
{
for(int i=0;i<10;i++)
{
que->put(i);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
void consumer(Queue* que)
{
for(int i=0;i<10;i++)
{
que->get();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
int main()
{
Queue que;
thread t1(produce,&que);
thread t2(consumer,&que);
t1.join();
t2.join();
}