Buffer实现,存放指针对象.


//Buffer.h
#include <queue>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>

template<class T>
class Buffer
{
public:
Buffer();
static const char* MODULE;

bool Init();
inline void Notify() {m_bInterrupt = true; m_NotEmpty.notify_one();}
virtual void Add(T const &val);
T Get();
volatile unsigned int GetSize() const {return m_Size;}

void Remove();//!< Removes from queue
//!< Switches Auto Removing function for queue
void SetAutoRemove(bool bVal=true) {m_AutoRemove = bVal;}

private:
boost::mutex m_Mutex;
boost::condition m_NotEmpty;
volatile bool m_bInterrupt;

volatile unsigned int m_Size;
std::queue<T> m_Queue;
bool m_AutoRemove;
};





//Buffer.cpp
#include "Buffer.h"

template <class T>
const char* Buffer<T>::MODULE = "Buffer";

template <class T>
Buffer<T>::Buffer() : m_Size(0),
m_AutoRemove(true), m_bInterrupt(false)
{
}

template <class T>
bool Buffer<T>::Init()
{
while (!m_Queue.empty()) m_Queue.pop();
m_Size = 0;
m_AutoRemove = true;
return true;
}

template <class T>
void Buffer<T>::Add(T const &val)
{
boost::unique_lock<boost::mutex> lock(m_Mutex);
m_Queue.push(val);
++m_Size;

m_NotEmpty.notify_one();
}

template <class T>
void Buffer<T>::Remove()
{
boost::unique_lock<boost::mutex> lock(m_Mutex);
if (!m_AutoRemove)
{
m_Queue.pop();
}
}
template <class T>
T Buffer<T>::Get()
{
boost::unique_lock<boost::mutex> lock(m_Mutex);

if (m_Size==0)
{
while (m_bInterrupt==false && m_Size==0)
{

m_NotEmpty.wait(lock);
}
if (m_bInterrupt)
{
m_bInterrupt = false;
return NULL;
}
}

T val = m_Queue.front();
if (m_AutoRemove)
m_Queue.pop();
--m_Size;
return val;
}






#include <iostream>
#include <sstream>
#include <string>
#include "Buffer.cpp"

class TestClass
{
public:
TestClass(){};
TestClass(std::string &in_name){m_name = in_name;};
void OutPutName()
{
std::cout<<m_name<<std::endl;
}
private:
std::string m_name;
};

int main()
{
Buffer<TestClass*> buffers;
std::string name = "Cat";
TestClass *tc1 = new TestClass(name);
name = "Monkey";
TestClass *tc2 = new TestClass(name);
name = "Dog";
TestClass *tc3 = new TestClass(name);
buffers.Add(tc1);
buffers.Add(tc2);
buffers.Add(tc3);
TestClass *tc;
while((tc =buffers.Get())!= NULL)
{
tc->OutPutName();
std::cout<<"size:"<<buffers.GetSize()<<std::endl;
if(buffers.GetSize() == 0)
{
return 0;
}
}
return 0;
}




Result:
Cat
size:2
Monkey
size:1
Dog
size:0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值