ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Object Pool
    C++ 2014. 3. 9. 06:46

    객체 Pool은 객체 생성/소멸이 많이 발생하여야 하는 객체를 미리 생성하여 Queue에 쌓아 두었다가 요청시 마다 꺼내쓰는 객체 저장소 이다. 실제로 데이타 베이스를 반복적으로 검색하고 변경을 해야 하는 일반 고객 업무 같은 경우는 이런 객체 풀을 사용하며 좀더 놓은 효울을 가질 수가 있다.

    #include <queue>

    #include <memory>

    #include <stdexcept>

    using namespace std;

     

    #define DEFAULT_CHUNK_SIZE 10

     

    template <typename T>

    class ObjectPool

    {

    private:

        queue<shared_ptr<T>> mFreeList;

        size_t mChuckSize;

        ObjectPool(const ObjectPool<T>&src);

        ObjectPool operator=(const ObjectPool<T>&rhs);

    public:

        ObjectPool(size_t chunkSize = DEFAULT_CHUNK_SIZE) throw (invalid_argument, bad_alloc);

        virtual ~ObjectPool(void);

        shared_ptr<T> accquireObject();

        void releaseObject(shared_ptr<T> obj);

    };

     

     

    template <typename T>

    ObjectPool<T>::ObjectPool(size_t chunkSize)

        throw (std::invalid_argument, std::bad_alloc)

    {

        if (chunkSize<=0)

            throw std::invalid_argument("chuck size sholud be positive value");

     

        mChuckSize = chunkSize;

     

        for (int i=0;i<mChuckSize;++i) {

            mFreeList.push(make_shared<T>());

        }

    }

     

    template <typename T>

    shared_ptr<T> ObjectPool<T>::accquireObject()

    {

        if (mFreeList.empty()) {

            for (int i=0;i<mChuckSize;++i) {

                mFreeList.push(make_shared<T>());

            }

        }

        auto obj = mFreeList.front();

        mFreeList.pop();

        cout << "accquireObject " << obj << endl;

        return obj;

    }

     

    template <typename T>

    void ObjectPool<T>::releaseObject(shared_ptr<T> obj)

    {

        mFreeList.push(obj);

        cout << "releaseObject " << obj << endl;

     

    }

     

    template <typename T>

    ObjectPool<T>::~ObjectPool(void)

    {

     

    }

     

    Void main()

    {

        ObjectPool<Reservation> requestPool(10);

        for (int i=0;i<MAX_SEAT;++i) {

            auto req = requestPool.accquireObject();

            cout << "Seat " << req->Request() << " is reserverd" << endl;

            requestPool.releaseObject(req);

        }

    }

    'C++' 카테고리의 다른 글

    Big-O Notation  (0) 2014.03.20
    Volitile Keyword  (0) 2014.03.09
    Dynamic Memory Allocation and Memory Leak  (0) 2014.03.02
    Rvalue reference (우측값 참조)  (0) 2014.02.28
    Rambda Expression  (0) 2014.02.26
Designed by Tistory.