用c++11写的一个线程安全的队列

#ifndef  __MSG__QUEUE__H__
#define  __MSG__QUEUE__H__

#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>

template<class T>
class CMultiThreadQueue
{
public:
	CMultiThreadQueue() : m_nWaitCount(0)
	{
	}

	~CMultiThreadQueue()
	{
		std::unique_lock<std::mutex> lck(m_mutex);

		while (!m_queue.empty())
		{
			T* pElem = m_queue.front();
			m_queue.pop();
			if (pElem != NULL)
			{
				delete pElem;
				pElem = NULL;
			}
		}

	}

public:
	bool Put(T* pElement)
	{
		if (pElement == NULL)
		{
			return false;
		}

		std::unique_lock<std::mutex> lck(m_mutex);
		m_queue.push(pElement);
		if (m_nWaitCount > 0)
		{
			m_cv.notify_one();
		}
		return true;
	}

	bool Get(T* & refElement, long nMicroSeconds = -1)
	{
		refElement = NULL;

		std::unique_lock<std::mutex> lck(m_mutex);

		if (!m_queue.empty())
		{
			refElement = m_queue.front();
			m_queue.pop();
			return true;
		}
		
		//等待的作业数加1
		m_nWaitCount++;

		if (nMicroSeconds > 0)
		{
			//等待指定的时间,时间到了返回false
			if (std::cv_status::timeout == m_cv.wait_for(lck, std::chrono::microseconds(nMicroSeconds)))
				return false;
		}
		else
		{
			//永久等待
			m_cv.wait(lck);
		}

		m_nWaitCount--;

		if (!m_queue.empty())
		{
			refElement = m_queue.front();
			m_queue.pop();
			return true;
		}

		return false;
	}

private:
	std::queue<T*> m_queue;
	std::mutex m_mutex;
	std::condition_variable m_cv;
	int m_nWaitCount;
};
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值