ACE_Messae_Block中结合了ACE_Allocator,使ACE_Message_Block更加灵活,本文中将简单介绍ACE_Message_Block和ACE_Allocator的使用方法,及注意事项。
  首先我们看看ACE_Message_Block的构着函数:
ACE_Message_Block (size_t size,
                     ACE_Message_Type type 
= MB_DATA,
                     ACE_Message_Block 
*cont = 0,
                     
const char *data = 0,
                     ACE_Allocator 
*allocator_strategy = 0,
                     ACE_Lock 
*locking_strategy = 0,
                     unsigned 
long priority = ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY,
                     
const ACE_Time_Value &execution_time = ACE_Time_Value::zero,
                     
const ACE_Time_Value &deadline_time = ACE_Time_Value::max_time,
                     ACE_Allocator 
*data_block_allocator = 0,
                     ACE_Allocator 
*message_block_allocator = 0);

    其中,使用了三个分配器,Allocator_stratey,data_block_allocator,message_block_allocator,这三个分配器是为ACE_Message_Block中两个对象及器本身分配内存的,data_block, 以及data_block指向的char*内存。
    如此构着三个分配器传入进去,就可以实现预先分配内存的效果。
   
msg_allocator_=new ACE_Cached_Allocator<ACE_Message_Block,ACE_SYNCH_MUTEX>(MsgCount);
    data_allocator_ 
=new ACE_Cached_Allocator<ACE_Data_Block,ACE_SYNCH_MUTEX>(BuffCount);
    buff_allocator_
=new ACE_Cached_Allocator<MEM_BUF,ACE_SYNCH_MUTEX>(BuffCount);
   查看ACE_Message_Block的代码,可以发现,在调用其Release方法时,会先检查是否使用分配其,如果没有使用,直接delete掉,如果使用了分配器,则把内存归还给分配器。
    其中还必须注意一个参数,即locking_strategy,这是一把多线程同步的锁,其主要时在进行浅层拷贝或者release时进行线程安全控制。比如,在调用duplicate或者release时要增减引用计数器。
    下次在写怎样合理使用locking_strategy,使其不影响效率,:)
posted on 2006-08-21 17:36  以天  阅读(1451)  评论(1编辑  收藏  举报