#pragma once
#include <tbb/concurrent_queue.h>
#include <type_traits>
#include <atomic>
template<typename T>
class CObjectPool{
public:
CObjectPool(int size = 100){
_maxSize = size;
for (int i = 0; i < _maxSize; ++i) {
T* newObject = new T();
_qObjects.push(newObject);
}
}
~CObjectPool()
{
while (!_qObjects.empty()) {
T* object;
if( _qObjects.try_pop( object ) == true ){
delete object;
}
}
_maxSize = 0;
}
// 오브젝트를 꺼낸다.
T* PopObject()
{
T* retVal;
// 꺼낼게 없으면 하나 걍 만들자.
if( _qObjects.try_pop(retVal) == false ){
retVal = new T();
++_maxSize;
}
return new (retVal) T;
}
// 오브젝트를 수거한다.
void ReturnObject(T* object)
{
object->~T();
_qObjects.push(object);
}
private:
tbb::concurrent_queue<T*> _qObjects;
std::atomic<int> _maxSize; // 최대 배열 크기 (누수 체크나 모니터링 용도로 사용하면 좋을듯)
};
예전에 학생시절에 작성했던(developstudy.tistory.com/44) 코드를 보고 많이 비효율적으로 보여서,
락을 거두어내고 tbb로 대체하고 싶어서 다시 작성해보았음.
생성자 소멸자를 호출하는 방식으로 구현되었는데, 이상하면 Init 같은거를 호출하도록 수정해도 좋을듯.
'Programming > C++ & Unreal' 카테고리의 다른 글
C++ RTTI 구현 (0) | 2021.05.02 |
---|---|
Xcode tbb 설치 (0) | 2020.12.06 |
tbb concurrent bounded queue 차이 (0) | 2020.12.05 |
직렬화 라이브러리 완성! (0) | 2020.02.24 |
C++ region (0) | 2020.02.20 |