#include<iostream>
#include<list>
#include<mutex>
#include<thread>
#include<queue>
#include<condition_variable>
std::mutex mtx;
std::condition_variable cv;
//生产者生产完毕之后,通知消费者,消费者消费完毕之后通知生产者。
class Queue{
public :
void push(int id){
std::unique_lock<std::mutex> lck(mtx);
if(!que.empty()){
//通知消费者消费
cv.wait(lck);//生产者线程进入等待状态。
}
que.push(id);
cv.notify_all();//通知所有的线程
//cv.notify_one();//通知阻塞在这把锁上的一个线程
//其他线程得到这个信号就会从等待状态转换成阻塞状态,然后获取互斥锁才能继续执行。
std::cout<<"生产者生产value"<<id<<std::endl;
}
int get(){
std::unique_lock<std::mutex> lck(mtx);
while(que.empty()){
//通知生产者去生产
cv.wait(lck);
}
int val = que.front();
que.pop();
cv.notify_all();//通知其他线程,我消费完了,生产吧。
std::cout<<"消费者消费value"<<val<<std::endl;
return val;
}
private:
std::queue<int> que;
};
void producer(Queue *que){
for(int i=0;i<=100;i++){
que->push(i);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void consumer(Queue *que){
for(int i=0;i<=100;i++){
que->get();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
int main(){
Queue que;
std::thread t1(producer,&que);
std::thread t2(consumer,&que);
t1.join();
t2.join();
return 0;
}
C++11 uniptr_lock + condition_vartiable 实现生产者消费者模型
最新推荐文章于 2021-12-11 20:29:54 发布