43 lines
1.1 KiB
C++
43 lines
1.1 KiB
C++
![]() |
#include"neicun.h"
|
|||
|
#include <iostream>
|
|||
|
#include <new> // <20><><EFBFBD><EFBFBD> operator new <20><> operator delete <20>Ķ<EFBFBD><C4B6><EFBFBD>
|
|||
|
|
|||
|
// <20><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
ThreadSafeMemoryPool::ThreadSafeMemoryPool(size_t blockSize, size_t blockCount)
|
|||
|
: blockSize_(blockSize), blockCount_(blockCount) {
|
|||
|
init();
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
void* ThreadSafeMemoryPool::allocate() {
|
|||
|
std::lock_guard<std::mutex> lock(mutex_);
|
|||
|
if (freeBlocks_.empty()) {
|
|||
|
std::cerr << "Memory pool exhausted!" << std::endl;
|
|||
|
return nullptr;
|
|||
|
}
|
|||
|
void* block = freeBlocks_.back();
|
|||
|
freeBlocks_.pop_back();
|
|||
|
return block;
|
|||
|
}
|
|||
|
|
|||
|
// <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|||
|
void ThreadSafeMemoryPool::deallocate(void* ptr) {
|
|||
|
std::lock_guard<std::mutex> lock(mutex_);
|
|||
|
freeBlocks_.push_back(ptr);
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ThreadSafeMemoryPool::~ThreadSafeMemoryPool() {
|
|||
|
for (void* block : allocatedBlocks_) {
|
|||
|
::operator delete(block); // ʹ<><CAB9>ȫ<EFBFBD>ֵ<EFBFBD> operator delete <20>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20><>ʼ<EFBFBD><CABC><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>
|
|||
|
void ThreadSafeMemoryPool::init() {
|
|||
|
for (size_t i = 0; i < blockCount_; ++i) {
|
|||
|
void* block = ::operator new(blockSize_); // ʹ<><CAB9>ȫ<EFBFBD>ֵ<EFBFBD> operator new <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|||
|
allocatedBlocks_.push_back(block);
|
|||
|
freeBlocks_.push_back(block);
|
|||
|
}
|
|||
|
}
|