生产者、消费者+信号量

生产者与消费者模式:

一种设计模式–针对典型场景设计的解决方案。
一个场景,两种角色,三种关系。

生产者与消费者模型针对这种场景所解决的问题:
a.解耦合(生产者与消费者不再直接进行数据交互)
b.支持并发(支持多个生产者、消费者)
c.支持忙闲不均(可以将数据放到缓冲带缓存,避免来不及处理的情况)

生产者与消费者模型的实现:
生产者与消费者只是不同角色的执行流。
只需要中间实现线程安全的队列,然后再各自创建不同角色的执行流就可以实现这个模型。
在这里插入图片描述
线程安全阻塞队列的实现:
用C++封装实现一个阻塞队列类::stl中我们学习了队列容器 std::queue。但是这个队列是非线程安全。

class BlockQueue
{
private:     
      std::queue<int> _queue;//stl中queue
      int _capcity;//定义队列在最大的节点数量
      pthread_mutex_t _mutex;//互斥锁保护临界资源queue的访问
      pthread_cond_t _cond_con;//消费者等待队列,实现同步
      pthread_cond_t _cond_pro;//生产者等待队列,实现同步

public:
      BlockQueue(int max_que=MAX_QUEUE){…初始化过程…}
      ~BlockQueue(){…资源销毁过程…}
      bool Push(int data);//生产者入队操作
      bool Pop(int *data);//消费者出队操作
}

#include <cstdio>
#include <iostream>
#include <queue>
#include <pthread.h>

#define MAX_QUEUE 5
class BlockQueue
{
    public:
        BlockQueue(int max = MAX_QUEUE):_capacity(max){
            pthread_mutex_init(&_mutex, NULL);
            pthread_cond_init(&_cond_con, NULL);
            pthread_cond_init(&_cond_pro, NULL);
        }
        ~BlockQueue(){
            pthread_mutex_destroy(&_mutex);
            pthread_cond_destroy(&_cond_con);
            pthread_cond_destroy(&_cond_pro);
        }
        bool Push(int data) {
            //入队的操作,肯定是生产者
            //1. 加锁操作
            pthread_mutex_lock(&_mutex);
            //2. 判断队列是否满了
            while (_queue.size() == _capacity) {
                //若不满足(队列已经满了),
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值