windows 下C++对象池实现,支持并发

来源:互联网 发布:网络销售是什么意思 编辑:程序博客网 时间:2024/05/24 04:43
#pragma once//#include "FSNIAlgo.h"#include "Windows.h"#include <queue>#define MINALGOSIZE 1template<class T>class FSNIObjPool{public:FSNIObjPool(void);~FSNIObjPool(void);void AlloAlgoPool();T* GetAlgoObj();void ReleaseAlgoObj(T *p);void DeleteAlgoObj(T *obj);private:HANDLE m_hAlgoMutex;std::queue<T *> m_queAlgoPool;};
<pre name="code" class="cpp">#include "StdAfx.h"#include "FSNIObjPool.h"template<typename T>FSNIObjPool<T>::FSNIObjPool(void){m_hAlgoMutex = CreateMutex(NULL, FALSE, NULL);if (!m_hAlgoMutex){printf("CreateMutex failed, error id=%d!!!!!", GetLastError());}}template<typename T>FSNIObjPool<T>::~FSNIObjPool(void){int i = m_queAlgoPool.size();while(m_queAlgoPool.size()>0){T *fsni = m_queAlgoPool.front();m_queAlgoPool.pop();DeleteAlgoObj(fsni);}}template<typename T>void FSNIObjPool<T>::AlloAlgoPool(){for (int i=0; i<MINALGOSIZE; i++){T *algo = new T();algo->InitFaceObj();m_queAlgoPool.push(algo);}}template<typename T>T* FSNIObjPool<T>::GetAlgoObj(){WaitForSingleObject(m_hAlgoMutex, INFINITE);for (int i=0; i<m_queAlgoPool.size(); i++){T *fsni = m_queAlgoPool.front();m_queAlgoPool.pop();ReleaseMutex(m_hAlgoMutex);return fsni;}T *fsni = new T;fsni->InitFaceObj();ReleaseMutex(m_hAlgoMutex);return fsni;}template<typename T>void FSNIObjPool<T>::ReleaseAlgoObj(T *p){WaitForSingleObject(m_hAlgoMutex, INFINITE);m_queAlgoPool.push(p);ReleaseMutex(m_hAlgoMutex);}template<typename T>void FSNIObjPool<T>::DeleteAlgoObj(T *obj){delete obj;}



0 0
原创粉丝点击