内存池(节点分配)
来源:互联网 发布:淘宝外穿铅笔裤 编辑:程序博客网 时间:2024/06/06 03:49
#define JYMEMORY_POOL_H_
#include "JYChunk.h"
#include "JYMutex.h"
#include <iostream>
#include <vector>
#include <list>
using namespace std;
class JYMemoryPool
{
public:
JYMemoryPool(int pool_size);
~JYMemoryPool();
JYChunk* Alloc();
int Free(JYChunk* chunk);
public:
static JYMemoryPool* GetInstance();
private:
list<JYChunk*>m_memory_list;
int m_pool_size;
JYMutex m_mutex;
private:
static JYMemoryPool *g_pool;
};
#endif
#include "JYMemoryPool.h"
JYMemoryPool* JYMemoryPool::g_pool = NULL;
JYMemoryPool::JYMemoryPool(int pool_size)
{
m_mutex.Lock();
m_pool_size = pool_size;
for(int i=0; i<m_pool_size; i++)
{
JYChunk *chunk = new JYChunk(1024*10);
m_memory_list.push_back(chunk);
}
m_mutex.Unlock();
}
JYMemoryPool::~JYMemoryPool()
{
list<JYChunk*>(m_memory_list).swap(m_memory_list);
}
JYChunk* JYMemoryPool::Alloc()
{
m_mutex.Lock();
if(m_memory_list.size() <= 0)
{
m_mutex.Unlock();
return NULL;
}
JYChunk *chunk = m_memory_list.front();
if(chunk->Data()!=NULL && chunk->GetBlockSize()>=1024 && chunk->GetStatus() == idle)
{
m_mutex.Unlock();
m_memory_list.pop_front();
return chunk;
}
else
{
m_mutex.Unlock();
return NULL;
}
}
int JYMemoryPool::Free(JYChunk* chunk)
{
m_mutex.Lock();
if(m_memory_list.size()>= m_pool_size)
{
m_mutex.Unlock();
return -1;
}
else
{
m_memory_list.push_back(chunk);
m_mutex.Unlock();
return 0;
}
}
JYMemoryPool* JYMemoryPool::GetInstance()
{
if(g_pool == NULL)
{
g_pool = new JYMemoryPool(100);
}
return g_pool;
}
#include "JYMemoryPool.h"
#include <string.h>
#include <stdio.h>
#include <unistd.h>
void *test(void *s)
{
JYMemoryPool *pool = JYMemoryPool::GetInstance();
for(int i=0; i<20000; i++)
{
JYChunk *chunk = pool->Alloc();
if(chunk)
{
char *buf = (char *)chunk->Data();
strcpy(buf, "222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222");
cout << buf << "\n"<< i <<endl;
pool->Free(chunk);
}
}
}
int main()
{
int i;
for(i=0; i<100; i++)
{
pthread_t tid;
pthread_create(&tid, NULL, test, NULL);
cout << "thread number is " << i << endl;
}
sleep(1000000);
}
- 内存池(节点分配)
- 计算节点为虚拟机分配内存时预留内存设置
- 嵌入式操作系统内核原理和开发(基于链表节点的内存分配算法)
- numa的内存按节点分配和线程绑定
- 内存分配(new/delete,malloc/free,allocator,内存池)
- 堆栈内存分配与内存池内存分配的区别
- Rv内存池分配图
- java内存分配 常量池
- java 内存分配 常量池
- 动态内存分配 (转载)
- 内存分配问题(转)
- 内存地址分配 (转载)
- Java内存分配(一)
- Java内存分配(二)
- Java内存分配(三)
- Windows内存分配(转)
- 内存分配原理(转)
- 内存分配管理(一)
- 解决Stm32出现..\HARDWARE\ADC\adc.c(22): error: #20: identifier "ADC_InitTypeDef" is undefined异常
- Json使用
- linux线程属性
- 结构体符号重载
- 如何在 Linux 中启用 Shell 脚本的调试模式
- 内存池(节点分配)
- 202. Happy Number
- javascript 学习笔记1基本语法
- TensorFlow6: 基于WiFi指纹的室内定位(autoencoder)
- Combinations
- Java 字节流与字符流的区别
- 56 leetcode - Jump Game
- jenkins 部署项目的一点建议
- 串口-关于vendor-id和product-id的查找