实际项目中的一个线程安全队列(boost)

实际项目中的一个线程安全队列(boost)

#ifndef _THREAD_SAFE_QUEUE_H_
#define _THREAD_SAFE_QUEUE_H_

#include<queue>
#include<memory>
#include <boost/thread/thread.hpp>
#include<boost/thread/mutex.hpp>
#include<boost/thread/condition_variable.hpp>

template<typename T>
class threadsafe_queue
{
private:
	boost::mutex mt; //boost::mutable 
	std::queue<T> data_queue;
	boost::condition_variable data_cond;     //条件变量
	bool bStop;
	int maxsz;
public:
	threadsafe_queue() :bStop(false),maxsz(1000) {}
	threadsafe_queue(threadsafe_queue const& other)
	{
		boost::lock_guard<boost::mutex> lk(other.mt);
		data_queue = other.data_queue;
	}

	/*
	* 函数名:setMax(int nSize)
	* 功能:设置队列最大容量
	* 参数:nSize 要设置的队列大小
	* 返回值:无
	*/
	void setMax(int nSize)
	{
		maxsz = nSize;
	}

	/*
	* 函数名:clear()
	* 功能:clear queue data
	* 参数:无
	* 返回值:无
	*/
	void clear()
	{
		boost::lock_guard<boost::mutex> lk(mt);
		while (data_queue.size() > 0) data_queue.pop();
	}

	/*
	* 函数名:size()
	* 功能:获取队列大小
	* 参数:无
	* 返回值:无
	*/
	size_t size() //const
	{
		boost::lock_guard<boost::mutex> lk(mt);
		return data_queue.size();
	}

	/*
	* 函数名:empty()
	* 功能:队列是否为空
	* 参数:无
	* 返回值:true 空  false 不为空
	*/
	bool empty() //const
	{
		boost::lock_guard<boost::mutex> lk(mt);
		return data_queue.empty();
	}

	/*
	* 函数名:push(T new_value)
	* 功能:新的数据插入队列,并通知线程主备完成
	* 参数:new_value
	* 返回值:无
	*/
	void push(T new_value)
	{
		boost::lock_guard<boost::mutex> lk(mt);
		if (data_queue.size() < (UINT)maxsz)
		{
			data_queue.push(new_value);
			data_cond.notify_all();
			//data_cond.notify_one();
		}
	}

	/*
	* 函数名:try_pop(T& value)
	* 功能:获取队列数据
	* 参数:
	* 返回值:
	*/
	bool try_pop(T& value)
	{
		boost::unique_lock<boost::mutex> lk(mt);
		if (data_queue.empty()) return false;

		value = std::move(data_queue.front());//data_queue.front();
		data_queue.pop();
		return true;
	}

	/*
	* 函数名:wait_and_pop(T& value, bool &bStatus)
	* 功能:从线程安全队列获取要处理的数据,阻塞线程,并获取当前的运行状态
	* 参数:value 要插入的数据  bStatus 返回当前运行状态
	* 返回值:无
	*/
	void wait_and_pop(T& value, bool& bStatus)
	{
		boost::unique_lock<boost::mutex> lk(mt);
		data_cond.wait(lk, [this, &bStatus]()->bool {
			bStatus = bStop;
		if (bStatus)
		{
			return bStatus;
		}
		else
		{
			return !data_queue.empty();
		}});

		//如果是结束线程,不需要从队列弹出数据
		if (!bStatus)
		{
			value = data_queue.front();
			data_queue.pop();
		}
	}

	/*
	* 函数名:data_cond_notify(bool const &b_Stop)
	* 功能:设置结束标志,并通知所有被阻塞的任务处理线程,解锁被阻塞状态
	* 参数:b_Stop 状态 fasle : 初始状态  true: 结束
	* 返回值:无
	*/
	void data_cond_notify(bool const& b_Stop)
	{
		bStop = b_Stop;
		if (b_Stop)
		{
			data_cond.notify_all();
		}
	}
};



#endif