#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
用c++11写的一个线程安全的队列
最新推荐文章于 2025-03-02 22:06:09 发布