#include<iostream>
#include<thread>
#include<mutex>
#include<atomic>
#include<queue>
#include<condition_variable>
#include<random>
using namespace std;
queue<int> table;
mutex m;
//这个m就像一个全局的闹钟,N个unique_lock都看着他,然后通过cv.wait这些unique_lock,一旦闹钟叫了,就可以确定是 cv.notify_one还是cv.notify_all了
random_device rnd; //用于产生随机数
condition_variable cv;
void maker(){
int count;
while(1){
cout<<"输入生产面包的个数"<<endl;
cin>>count;
unique_lock<mutex> lock(m);
for(int i=0;i<count;i++)
{
table.push(
rnd()%100 //压入一个随机数
);
}
lock.unlock(); //解锁,防止写脏
cv.notify_all();//叫所有人出来吃饭饭
}
}
void customer(int id){
//消费者线程
int number;
while(1){
unique_lock<mutex> lock(m);
cv.wait(lock,[]{return !table.empty();}); //等待唤醒,另外防止队列为空时出错,再加一个条件
number=table.front(); //当被唤醒以后,这个线程就会往下走,走到这里了,从队列的前端取出一个数
table.pop();
lock.unlock();
cout<<id<<":"<<number<<endl;
}
}
int main(){
for(int i=0;i<8;i++){
thread t=thread(customer,i); //8核电脑,创建8个消费者线程
t.detach();
}
maker();
return 0;
}