`
mylove2060
  • 浏览: 335348 次
  • 性别: 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
分享到:
评论

相关推荐

    C++ 内存管理算法和实现.

    `unique_ptr`拥有对象的唯一所有权,而`shared_ptr`允许多个指针共享所有权,当引用计数为零时自动删除对象。 总的来说,C++内存管理是一个深奥的话题,涵盖了许多底层细节和高级技术。理解和掌握这些知识对于编写...

    藏经阁-穆客带你快速定位 Node.js 内存泄露.pdf

    V8引擎负责管理JavaScript对象的内存,它将内存划分为不同的区域,如新生区、老生指针区、老生数据区、大对象区、Code区以及Cell区等。新生区用于存储新创建的对象,频繁进行垃圾回收;老生区则保存生命周期较长的...

    易语言对象取CPU序列号源码

    "对象取CPU序列号源码"是易语言中实现这一功能的代码片段,下面我们将详细探讨如何在易语言中获取CPU序列号以及相关的编程知识点。 首先,CPU序列号是处理器的一个唯一标识,由制造商分配,通常存储在CPU的ROM中。...

    jsp内置对象的用法

    `application`对象实现了用户间数据的共享,存放全局变量。它是`ServletContext`类的实例。 - **常用方法**: - `getAttribute(String name)`: 返回给定名称的属性值。 - `getAttributeNames()`: 返回所有可用属性...

    delphi BlockRead用法的源码实例

    - `Buffer`: 一个指针,指向你要存放读取数据的内存区域。 - `Count`: 指定要读取的字节数。 `BlockRead`函数返回实际读取的字节数。如果遇到文件末尾或其他错误,返回值可能会小于`Count`。 现在,让我们看一个...

    FATFS文件系统应用程序手册(中文版).pdf

    它需要文件对象指针(FIL* FileObject)、缓冲区指针(void* Buffer)、要读取的字节数(UINT ByteToRead),以及一个指向实际读取字节数的指针(UINT* ByteRead)。成功读取数据后,ByteRead中会存放实际读取的字节...

    如何用VB.NET存取SQL Server2000中的图像数据.pdf

    BLOB数据并不是直接存储在用户定义的字段上,而是存放在系统开辟的新页面中,表中BLOB类型数据字段实际上仅存储一个16字节的指针,这个指针指向实际存储BLOB数据的页面。 ***中图像数据的存取方法 ***使用...

    01.Java内存模型1

    局部变量表存放了编译器可知的各种基本类型、对象引用(不同于对象本身,可能是指向一个对象起始地址的引用指针、可能是执行一个代表对象的句柄或者其他与此对象的位置)和returnAddress类型。 三、本地方法栈 ...

    学习笔记之java虚拟机

    - 对象头包含运行时数据和类型指针,用于标记对象的状态和指向类元数据的信息。 - 实例数据存储对象的实际信息。 - 对齐填充是为了让对象大小符合特定的字节数对齐规则。 - **对象的访问定位**: - 可以通过...

    JVM调优攻略.pdf

    - **类型指针**:指向对象的类元数据指针,默认情况下8字节,在JDK1.8之后,默认开启指针压缩,此时大小变为4字节。 - **实例数据**:存储对象的实际数据。 - **对齐填充**:为了性能考虑,确保对象占用的内存是8...

    重庆大学C语言程序设计复习题及参考答案

    选项B错误,因为结构体指针不能存放任意类型结构体的地址,选项C错误,因为结构体指针可以在函数参数中使用,选项D错误,因为结构体变量的地址需要用取地址运算符(&)获取。 10. 字符串输入:gets函数用于从标准输入...

    Java JVM 面试题总结

    - **直接指针**:对象头中直接存放对象数据的地址,这种方式减少了指针寻址的开销。 #### 8. 如何判断对象已经死亡? 判断对象是否可被回收通常采用可达性分析算法,如果从GC Roots出发,没有任何引用链可以到达...

    理论:第十三章:堆溢出,栈溢出的出现场景以及解决方案.docx

    1. OutOfMemoryError: Java heap space:堆内存中的空间不足以存放新创建的对象。 2. OutOfMemoryError: GC overhead limit exceeded:超过 98% 的时间用来做 GC 并且回收了不到 2% 的堆内存。 3. OutOfMemoryError:...

    Java虚拟机学习和总结(1&amp;2)

    1. **对象分配**:通常在堆中进行,对于小对象可能使用TLAB(Thread Local Allocation Buffer)优化分配速度。 2. **对象初始化**:执行类的构造器,确保对象正确初始化。 3. **对象访问方式**:通过句柄或直接指针...

    Delphi流操作的语法

    - `var Buffer`:用于存放读取数据的缓冲区。 - `Count`:要读取的数据字节数。 - **返回值**:实际读取的数据字节数,可能小于或等于 `Count`。 2. **Write 方法**:将数据写入流。 - **函数原型**:`Function...

    JVM常用知识(面试可用)

    年轻代主要存放新创建的对象,老年代则存储生命周期较长的对象。 - **程序计数器**:每个线程都有一个独立的计数器,记录当前线程正在执行的字节码指令地址。 - **虚拟机栈**:每个方法调用对应一个栈帧,存储局部...

    Buffer-OverFlow-Prep:OSCP的缓冲区溢出准备

    2. 堆溢出:发生在堆内存中的缓冲区溢出,攻击者可能利用堆溢出篡改其他对象,如字符串指针,间接控制程序执行。 3. BSS段溢出:BSS段存放未初始化的全局变量和静态变量,溢出可能导致变量值被改变。 4. 数据段溢出...

    java中调用C++生成的DLL

    数组元素需要通过JNIEnv对象的特定方法获取,例如:`(*env).GetByteArrayElements()`。 - **返回值** 可以直接使用`return`语句返回,也可以通过设置参数列表中的变量指针来返回信息。 #### 总结 通过以上步骤...

Global site tag (gtag.js) - Google Analytics