FixSizeMemoryPool.h
#pragma once
#include "BlockingQueue.h" //https://blog.csdn.net/weixin_42210846/article/details/124712457?spm=1001.2014.3001.5502
class CFixSizeMemoryPool
{
public:
CFixSizeMemoryPool(int num, int size);
~CFixSizeMemoryPool();
std::shared_ptr<void> GetChunk();
void Start() { queue_.Start(); }
void Notify() { queue_.Notify(); } //用于防止队列Pop时阻塞
size_t GetAvaliableChunkNum() { return queue_.Size(); }
private:
void* free_ = {};
const int chunkNum_;
const int chunkSize_;
BlockingQueue<void*> queue_;
};
FixSizeMemoryPool.cpp
#include "FixSizeMemoryPool.h"
CFixSizeMemoryPool::CFixSizeMemoryPool(int num, int size)
: chunkNum_(num), chunkSize_(size)
{
queue_.SetMaxSize(num);
free_ = new char[chunkNum_ * chunkSize_];
char* tmp = static_cast<char*>(free_);
for (int i = 0; i < num; ++i) {
queue_.Push(tmp);
tmp += chunkSize_;
}
}
CFixSizeMemoryPool::~CFixSizeMemoryPool()
{
delete[] free_;
}
std::shared_ptr<void> CFixSizeMemoryPool::GetChunk()
{
void* p;
bool res = queue_.Pop(p);
return res ? std::shared_ptr<void>(p, [this](void* s) {queue_.Push(s); }) : nullptr;
}