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

来源:互联网 发布:安装淘宝还要旺信吗 编辑:程序博客网 时间:2024/06/01 07:52
#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;}//等待的作业数加1m_nWaitCount++;if (nMicroSeconds > 0){//等待指定的时间,时间到了返回falseif (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