//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
分享到:
相关推荐
`unique_ptr`拥有对象的唯一所有权,而`shared_ptr`允许多个指针共享所有权,当引用计数为零时自动删除对象。 总的来说,C++内存管理是一个深奥的话题,涵盖了许多底层细节和高级技术。理解和掌握这些知识对于编写...
V8引擎负责管理JavaScript对象的内存,它将内存划分为不同的区域,如新生区、老生指针区、老生数据区、大对象区、Code区以及Cell区等。新生区用于存储新创建的对象,频繁进行垃圾回收;老生区则保存生命周期较长的...
"对象取CPU序列号源码"是易语言中实现这一功能的代码片段,下面我们将详细探讨如何在易语言中获取CPU序列号以及相关的编程知识点。 首先,CPU序列号是处理器的一个唯一标识,由制造商分配,通常存储在CPU的ROM中。...
`application`对象实现了用户间数据的共享,存放全局变量。它是`ServletContext`类的实例。 - **常用方法**: - `getAttribute(String name)`: 返回给定名称的属性值。 - `getAttributeNames()`: 返回所有可用属性...
- `Buffer`: 一个指针,指向你要存放读取数据的内存区域。 - `Count`: 指定要读取的字节数。 `BlockRead`函数返回实际读取的字节数。如果遇到文件末尾或其他错误,返回值可能会小于`Count`。 现在,让我们看一个...
它需要文件对象指针(FIL* FileObject)、缓冲区指针(void* Buffer)、要读取的字节数(UINT ByteToRead),以及一个指向实际读取字节数的指针(UINT* ByteRead)。成功读取数据后,ByteRead中会存放实际读取的字节...
BLOB数据并不是直接存储在用户定义的字段上,而是存放在系统开辟的新页面中,表中BLOB类型数据字段实际上仅存储一个16字节的指针,这个指针指向实际存储BLOB数据的页面。 ***中图像数据的存取方法 ***使用...
局部变量表存放了编译器可知的各种基本类型、对象引用(不同于对象本身,可能是指向一个对象起始地址的引用指针、可能是执行一个代表对象的句柄或者其他与此对象的位置)和returnAddress类型。 三、本地方法栈 ...
- 对象头包含运行时数据和类型指针,用于标记对象的状态和指向类元数据的信息。 - 实例数据存储对象的实际信息。 - 对齐填充是为了让对象大小符合特定的字节数对齐规则。 - **对象的访问定位**: - 可以通过...
- **类型指针**:指向对象的类元数据指针,默认情况下8字节,在JDK1.8之后,默认开启指针压缩,此时大小变为4字节。 - **实例数据**:存储对象的实际数据。 - **对齐填充**:为了性能考虑,确保对象占用的内存是8...
选项B错误,因为结构体指针不能存放任意类型结构体的地址,选项C错误,因为结构体指针可以在函数参数中使用,选项D错误,因为结构体变量的地址需要用取地址运算符(&)获取。 10. 字符串输入:gets函数用于从标准输入...
- **直接指针**:对象头中直接存放对象数据的地址,这种方式减少了指针寻址的开销。 #### 8. 如何判断对象已经死亡? 判断对象是否可被回收通常采用可达性分析算法,如果从GC Roots出发,没有任何引用链可以到达...
1. OutOfMemoryError: Java heap space:堆内存中的空间不足以存放新创建的对象。 2. OutOfMemoryError: GC overhead limit exceeded:超过 98% 的时间用来做 GC 并且回收了不到 2% 的堆内存。 3. OutOfMemoryError:...
1. **对象分配**:通常在堆中进行,对于小对象可能使用TLAB(Thread Local Allocation Buffer)优化分配速度。 2. **对象初始化**:执行类的构造器,确保对象正确初始化。 3. **对象访问方式**:通过句柄或直接指针...
- `var Buffer`:用于存放读取数据的缓冲区。 - `Count`:要读取的数据字节数。 - **返回值**:实际读取的数据字节数,可能小于或等于 `Count`。 2. **Write 方法**:将数据写入流。 - **函数原型**:`Function...
年轻代主要存放新创建的对象,老年代则存储生命周期较长的对象。 - **程序计数器**:每个线程都有一个独立的计数器,记录当前线程正在执行的字节码指令地址。 - **虚拟机栈**:每个方法调用对应一个栈帧,存储局部...
2. 堆溢出:发生在堆内存中的缓冲区溢出,攻击者可能利用堆溢出篡改其他对象,如字符串指针,间接控制程序执行。 3. BSS段溢出:BSS段存放未初始化的全局变量和静态变量,溢出可能导致变量值被改变。 4. 数据段溢出...
数组元素需要通过JNIEnv对象的特定方法获取,例如:`(*env).GetByteArrayElements()`。 - **返回值** 可以直接使用`return`语句返回,也可以通过设置参数列表中的变量指针来返回信息。 #### 总结 通过以上步骤...