//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
分享到:
相关推荐
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动, 直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
表示fp是指向FILE结构的指针变量,通过fp 即可找存放某个文件信息的结构变量,然后按结构变量提供的信息找到该文件, 实施对文件的操作。习惯上也笼统地把fp称为指向一个文件的指针。文件的打开与关闭文件在进行...
两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将...
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 学生...
//临界区对象的声明,用于管理缓冲区的互斥访问; int Buffer_Critical[MAX_BUFFER_NUM]; //缓冲区声明,用于存放产品; ThreadInfo Thread_Info[MAX_THREAD_NUM]; //线程信息数组; HANDLE h_Thread[MAX_THREAD_NUM]...
传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP...
我还传递了FORMAT_MESSAGE_ALLOCATE_BUFFER标志,告诉该函数为错误代码的文本描述分配足够大的内存块。该内存块的句柄将在hlocal变量中返回。第三个参数指明我们想要查找的错误代码的号码,第四个参数指明我们想要...
在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ;...