#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
留言评论
暂无留言