www.pudn.com > MyLinuxThread.rar > Queue.h, change:2007-05-18,size:3039b


#ifndef __G_QUEUE__
#define __G_QUEUE__
/// 
/// @file Queue.h
/// @brief 队列的简单封装 , 队列操作时加了锁的保护
/// @author guozhiming
/// @date 2007-04-17
/// 
#include "Lock.h"
#include "def.h"

template <class A>
class G_Queue
{
	public:
		/// @brief 构造函数
		/// 
		/// @param m_uQueSize 限制队列的大小, 如果m_uQueSize为0不限制队列的大小
		G_Queue(ULONG uQueSize = 0);

		/// @brief 析构函数
		~G_Queue();

		/// @brief 压一个元素入队列
		/// 
		/// @param item 一个元素
		/// 
		/// @return 如果为false 表示失败,如果为true表示成功
		bool push(const A &item);

		/// @brief 从对首弹出一个元素
		/// 
		/// @param item 存放在item
		/// 
		/// @return 如果为false 表示失败 ,如果为true表示成功
		bool pop(A &item);

		/// @brief 得到对首一个元素 , 但是不删除对首
		/// 
		/// @param item 存放在item
		/// 
		/// @return 如果为false 表示失败 , 如果为true表示成功
		bool getFront(A &item);

		/// @brief 判断队列是否为空
		/// 
		/// @return true为空队列 , false不为空队列
		bool isEmpty();

		/// @brief 清空队列
		void clear();

		/// @brief 去队列的大小
		/// 
		/// @return 队列的大小
		ULONG size();

		/// @brief 设置队列最大长度
		/// 
		/// @param maxSize 最大值
		/// 
		/// @return 如果maxSize 比m_uQueSize 小返回false , 否则返回true
		bool setQueueMaxSize(ULONG maxSize);

	private:
		
		deque<A> m_que;    ///STL 提供双向列表在插入和删除的操作中效率比vector高

		G_Lock m_lock;     ///读写锁

		ULONG m_uQueSize;   ///队列大小
};

template <class A>
G_Queue<A>::G_Queue(ULONG uQueSize)
{
	m_uQueSize = uQueSize;
}

template <class A>
G_Queue<A>::~G_Queue()
{
	m_que.clear();
}

template <class A>
bool G_Queue<A>::push(const A &item)
{
	m_lock.wLock();
	if(m_uQueSize && (m_que.size() == m_uQueSize))  ///如果限制队列大小才进行比较
	{
		m_lock.unwLock();
		return false;
	}
	
	m_que.push_back(item);
	m_lock.unwLock();
	return true;
}

template <class A>
bool G_Queue<A>::pop(A &item)
{
	m_lock.wLock();
	if(m_que.size() == 0)
	{
		m_lock.unwLock();
		return false;
	}

	item = m_que.front();
	m_que.pop_front();
	m_lock.unwLock();
	return true;
}

template <class A>
bool G_Queue<A>::getFront(A &item)
{
	m_lock.rLock();
	if(m_que.size() == 0)
	{
		m_lock.unwLock();
		return false;
	}
	item = m_que.front();
	m_lock.unrLock();
	return true;
}

template <class A>
bool G_Queue<A>::isEmpty()
{
	m_lock.rLock();
	bool bRet = m_que.empty();
	m_lock.unrLock();
	return bRet;
}

template <class A>
void G_Queue<A>::clear()
{
	m_lock.wLock();
	m_que.clear();
	m_lock.unwLock();
}

template <class A>
ULONG G_Queue<A>::size()
{
	m_lock.rLock();
	ULONG uSize = m_que.size();
	m_lock.unrLock();
	return uSize;
}

template <class A>
bool G_Queue<A>::setQueueMaxSize(ULONG maxSize)
{
	m_lock.wLock();
	if(maxSize = m_uQueSize)
	{
		m_lock.unwLock();
		return false;
	}

	m_lock.unwLock();
	return true;
}
#endif