特别声明:
建议使用google游览器,火狐也可以
论坛处于测试阶段,一切资料都为测试资料,在论坛正式运行的时候,会尽量保存网友的劳动成果!
HelloWorld论坛秉持互惠互利,共同学习与进步,一个人的梦想大家实现的理想,一直坚持着,望广大网友多多支持,提供宝贵意见
来论坛做什么?
可以先转载你平时学习查找的资料(先论坛查找),自己可以写写体会
把平时碰到的问题,如何解决可以先记录在论坛,以备后来的人学习
可以和会员一起参加一些开源项目的学习,汉化,推广,甚至可以加入团队
|
|
来源:http://www.cppblog.com/PeakGao/archive/2007/10/28/35364.html 基于我前一篇文章《基于ACE实现的一个内存池》的代码,这里是应用,有问题不要打我。。。 // MessageBlockManager.h /** * @date 2007.10.28 * @author PeakGao <peakgao163@163.com> */ #ifndef OM_MESSAGEBLOCKMANAGER_H #define OM_MESSAGEBLOCKMANAGER_H #include <ace/thread_mutex.h> #include <ace/synch_traits.h> #include <ace/message_block.h> #include "MemPoolT.h" namespace om{ class MessageBlockManager { typedef CachePool<ACE_SYNCH_MUTEX> MyCachePool; MyCachePool mBufPool; /// 缓存ACE_Data_Block的缓冲区 MyCachePool mDBPool; /// 缓存ACE_Data_Block对象本身,由于不能默认构造,所以没有用ObjectPool模版 MyCachePool mMBPool; /// 缓存ACE_Message_Block对象本身,由于不能默认构造,所以没有用ObjectPool模版 ACE_SYNCH_MUTEX* mMutex; /// 线程同步 public: static MessageBlockManager* instance(); MessageBlockManager(); ~MessageBlockManager(); /// 初始化参数 void create(size_t bufSize, size_t objCount); /// 清除缓冲池 void clear(); /// 分配一个消息块 ACE_Message_Block* alloc(); /// 释放指定的消息块 void free(ACE_Message_Block* mb); }; } // namespace om #endif // OM_MESSAGEBLOCKMANAGER_H // MessageBlockManager.cpp
/** * @date 2007.10.28 * @author PeakGao <peakgao163@163.com> */ #include "MessageBlockManager.h" namespace om{ MessageBlockManager* MessageBlockManager::instance() { static MessageBlockManager* mbm = 0; if (mbm == 0) mbm = new MessageBlockManager(); return mbm; } MessageBlockManager::MessageBlockManager() : mMutex(NULL) { } MessageBlockManager::~MessageBlockManager() { clear(); } void MessageBlockManager::clear() { if (mMutex) { mBufPool.clear(); mDBPool.clear(); mMBPool.clear(); delete mMutex; mMutex = NULL; } } void MessageBlockManager::create(size_t bufSize, size_t objCount) { if (!mMutex) mMutex = new ACE_SYNCH_MUTEX(); mBufPool.create(bufSize, objCount, mMutex); mDBPool.create(sizeof(ACE_Data_Block), objCount, mMutex); mMBPool.create(sizeof(ACE_Message_Block), objCount, mMutex); } ACE_Message_Block* MessageBlockManager::alloc() { void* buf = mBufPool.alloc(); ACE_Data_Block* db = ::new (mDBPool.alloc()) ACE_Data_Block(mBufPool.getBlockSize(), ACE_Message_Block::MB_DATA, static_cast<const char*>(buf), 0, 0, ACE_Message_Block::DONT_DELETE, 0); ACE_Message_Block* mb = ::new (mMBPool.alloc()) ACE_Message_Block(db, ACE_Message_Block::DONT_DELETE); return mb; } void MessageBlockManager::free(ACE_Message_Block* mb) { // 不要调用对象的release方法 mBufPool.free(mb->base()); ACE_Data_Block* db = mb->data_block(); db->~ACE_Data_Block(); mDBPool.free(db); mb->~ACE_Message_Block(); mMBPool.free(mb); } } // namespace om
|
|
|
Please Login (or Sign Up) to leave a comment |