c++11实现生产者消费者模型

 

1.生产者与消费者模型

一个场所,两种角色,三种关系。(场所:线程安全的队列)

2.优点

解耦、支持忙闲不均、支持并发

3.实现

用到互斥锁,条件变量

#include <thread>  
#include <mutex>  
#include <deque>  
#include <vector>  
#include <condition_variable>  



class Producer_Consumer  
{  
private:  
    deque<int> _q; //商品队列 
    mutex _mtx; // 全局互斥锁.  
    condition_variable _cv; // 全局条件变量.  
    int       _count;  //商品数
  
private:  
    void Product{  
        while (true){  

            unique_lock <mutex> lck(_mtx);  
            _count = ++_count % 1000;  
            printf("product %d\n", _count);  
            _q.push_back(_count);  
            lck.unlock();  
            _cv.notify_all();  
  
        }  
    }  
  
    void Consume{  
        while (true){  
            unique_lock <mutex> lck(_mtx);  
            whi
生产者消费者模型是一种并发编程模型,用于解决生产者和消费者之间的数据交换问题。在这个模型中,生产者负责生产数据,消费者负责消费数据。 模型实现通常涉及到共享资源(如队列)和同步机制(如锁、条件变量)。生产者和消费者通过共享的队列进行通信。当队列为空时,消费者将等待,直到有数据可供消费。当队列满时,生产者将等待,直到有空间可供生产。 在你提供的引用中,生产者线程和消费者线程使用了互斥锁和条件变量来实现同步。当消费者线程获取锁后,如果队列为空,则会进入等待状态,并释放锁。此时生产者线程可以获取锁,并判断队列是否为空,如果为空,则进入等待状态并释放锁。当生产者线程生产了产品后,会通过条件变量通知消费者线程可以消费了。消费者线程收到通知后,需要获取锁才能进行消费。 总结一下生产者消费者模型的步骤: 1. 定义共享队列作为生产者和消费者之间的数据交换通道。 2. 定义互斥锁,确保同时只有一个线程能够访问共享资源(即队列)。 3. 定义条件变量,用于线程间的通信。 4. 生产者线程获取互斥锁,判断队列是否已满,如果满则等待,否则生产数据并将其放入队列。 5. 如果消费者线程获取互斥锁,判断队列是否为空,如果为空则等待,否则消费数据并从队列中移除。 6. 在适当的时候,使用条件变量通知等待中的线程继续执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值