muduo库分析——base篇(6)BlockingQueue 和 BounderBlockingQueue

一个无界一个有界的生产者消费者队列

无界用的数据结构是队列

有界用的是环形缓冲区

什么场景适合什么数据结构在注释中简单的写了一点,更多的可以百度

无界用了一个条件变量,生产者生产后利用条件变量通知队列不为空,消费者利用条件变量通知生产者队列为空应该生产并进行等待

有界用了两个条件变量,因为多了一个条件就是队列满了后应该怎么做

T take()	//消费者只要有东西就消费
void put(const T& x)	//生产者只要生产了就通知

 void put(const T& x)	//生产者进行生产,当队列满时进行等待,生产后通知消费者
  {
    MutexLockGuard lock(mutex_);
    while (queue_.full())
    {
      notFull_.wait();
    }
    assert(!queue_.full());
    queue_.push_back(x);
    notEmpty_.notify();
  }
  T take()	//消费者队列空时等待,取出生产品后通知生产者进行生产
  {
    MutexLockGuard lock(mutex_);
    while (queue_.empty())
    {
      notEmpty_.wait();
    }
    assert(!queue_.empty());
    T front(queue_.front());
    queue_.pop_front();
    notFull_.notify();
    return front;
  }
  size_t size() const
  {
    MutexLockGuard lock(mutex_);
    return queue_.size();	//返回当前占用量
  }

  size_t capacity() const
  {
    MutexLockGuard lock(mutex_);
    return queue_.capacity();	//返回容量
  }
  boost::circular_buffer<T>  queue_;//环形缓冲区,数据频繁读写导致内存频繁释放和分配时,则使用环形缓冲区代替队列




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值