本帖最后由 独来读网 于 2012-7-5 14:37 编辑
我看了<ACE自适配通信环境中文技术文档>也看了
freeeyes ACE_Message_Block使用研究, 还是没搞明白这个内存池如何正确释放.
freeeyes ACE_Message_Block使用研究中说到,关于ACE进程级内存池类型的应用,这里是一个新的话题,等有时间专门开个帖子讨论。
什么时候能开这个话题?
modern,你好,这次我看了相关资料,代码也断点进去了,看到removeall中调用了
if (this->delete_lock_)
this->lock_->remove ();
即这个锁没有了,所以我再次用到这个内存池时,就出现了锁的问题.好像没有函数只进行
// Give the memory pool a chance to release its resources.
int const result = this->memory_pool_.release ();的操作.
typedef ACE_Malloc<ACE_LOCAL_MEMORY_POOL, ACE_SYNCH_MUTEX> MUTEX_MALLOC;
typedef ACE_Allocator_Adapter<MUTEX_MALLOC> Mutex_Allocator;
Mutex_Allocator g_msg_service_mb_allocator; //内存池分配器定义
//在内存池中分配一新的ACE_Message_Block* mb
ACE_Message_Block* mb = NULL;
ACE_NEW_MALLOC_NORETURN(mb,
static_cast<ACE_Message_Block*>( g_msg_service_mb_allocator.malloc(sizeof(ACE_Message_Block))),
ACE_Message_Block(sizeof(_MessageBase*), // size
ACE_Message_Block::MB_DATA, // type
0,
0,
&g_msg_service_mb_allocator, // allocator_strategy
0, // locking strategy
ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY, // priority
ACE_Time_Value::zero,
ACE_Time_Value::max_time,
&g_msg_service_mb_allocator,
&g_msg_service_mb_allocator
));
使用内存分配器分配内存,我的理解是g_msg_service_mb_allocator内部有n个空闲的ACE_Message_Block和已使用的ACE_Message_Block.
当我采用这个分配时,会拿出一个空闲的出来给用户,使用完了,会新建一个出来.
我就想在不用这个分配器的时候,将分配池清理一下,即调用g_msg_service_mb_allocator.remove().但我再次使用时,出现错误,错误出现在ACE_NEW_MALLOC_NORETURN这个执行体里面,具体错误被断点在了线程锁上,忘高手帮我一下.
|