内存池(节点分配)

#ifndef JYMEMORY_POOL_H_
#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值