`
mylove2060
  • 浏览: 331438 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

    jsp内置对象的用法

    application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动, 直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作...

    JAVA上百实例源码以及开源项目源代码

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    C语言程序设计标准教程

    表示fp是指向FILE结构的指针变量,通过fp 即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件, 实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。文件的打开与关闭文件在进行...

    JAVA上百实例源码以及开源项目

    两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...

    疯狂JAVA讲义

    5.1.3 对象、引用和指针 111 5.1.4 对象的this引用 112 5.2 方法详解 116 5.2.1 方法的所属性 116 5.2.2 方法的参数传递机制 116 5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生...

    消费者生产者模型 c++

    //临界区对象的声明,用于管理缓冲区的互斥访问; int Buffer_Critical[MAX_BUFFER_NUM]; //缓冲区声明,用于存放产品; ThreadInfo Thread_Info[MAX_THREAD_NUM]; //线程信息数组; HANDLE h_Thread[MAX_THREAD_NUM]...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP...

    VC++6.0核心编程源码.rar

    我还传递了FORMAT_MESSAGE_ALLOCATE_BUFFER标志,告诉该函数为错误代码的文本描述分配足够大的内存块。该内存块的句柄将在hlocal变量中返回。第三个参数指明我们想要查找的错误代码的号码,第四个参数指明我们想要...

    入门学习Linux常用必会60个命令实例详解doc/txt

    在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ;...

Global site tag (gtag.js) - Google Analytics