C++11 生产者 消费者模型 ——线程和条件变量condition_variable的应用

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值