muduo源码分析:无界队列和有界队列(消费者-生产者)

本文分析了muduo库中的无界队列和有界队列。无界队列允许不断生产,使用deque存储产品,生产时立即通知消费者,只需一个mutex和notEmpty条件变量。有界队列则参照c++教程网和《Linux多线程服务器端编程》进行实现。
摘要由CSDN通过智能技术生成

muduo库的队列很简单:

无界队列

put --生产

take--消费

size--返回现在的产品数

产品存放在deque里面

无界队列可以一直生产put,所以不用等待队列中有位置才生产,每生产一个产品就notify,只要通知一个消费者,不需要通知所有人

只有消费take时要判断有无产品,所以只需要一个mutex锁,一个条件变量notEmpty,消费者用来等待notEmpty有产品可以消费

#ifndef MUDUO_BASE_BLOCKINGQUEUE_H
#define MUDUO_BASE_BLOCKINGQUEUE_H

#include <muduo/base/Condition.h>
#include <muduo/base/Mutex.h>

#include <boost/noncopyable.hpp>
#include <deque>
#include <assert.h>

namespace muduo
{
template<typename T>
class BlockingQueue : boost::noncopyable
{
  public:
	explicit BlockingQueue()
		  :mutex_(),
		   notEmptyCond_(mutex_),
		   queue_()
	{}
	void put(const T& t)
	{
		{
			MutexLockGuard lock(mutex_);
			queue_.push_back(t);
		}
		notEmptyCond_.notify();//不需要notifyAll通知所有的,如果有阻塞,代表原先为空,现在只生产了一个,也只要一个消费来就足够了
	}
	T take()
	{
		MutexLockGuard lock(mutex_);
		while(queue_.empty())
		  notEmptyCond_.wait();
		assert(!queue_.empty());
		T front=queue_.front();
		queue_.pop_front();
		return front;
	}
	size_t size() const
	{
		MutexLockGuard lock(mutex_);
		return queue_.size();
	}

  private:
	mutable MutexLock mutex_;
	Condition notEmptyCond_;
	std::deque<T> queue_;
};

}

#endif

有界队列

有界队列用boost::circular_buffer<T>  queue_实现
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值