现在的位置: 首页 > 综合 > 正文

ACE_Message_Block的分配器的使用方法

2013年04月21日 ⁄ 综合 ⁄ 共 2791字 ⁄ 字号 评论关闭
 ACE_Message_Block的分配器的使用方法



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时要增减引用计数器。

** **  1 copy() 不需要让写指针后移. 
  ACE_Message_Block* mb = new ACE_Message_Block(BUFSIZ); 
  mb->copy(buff); //buff先已经初始化 
2 初始化mb后需要后移指针的情况 
  2.1 
  ACE_Message_Block* mb = new ACE_Message_Block(buff,len); 
  mb->wt_ptr(len);  //len是buff的长度 len = strlen(buff) +1 
                    // +1 表示后面的/0 
  2.2 
  ACE_Message_Block* mb = new ACE_Message_Block(BUFSIZ); 
  ACE_OS::sprintf(mb->wt_ptr(),buff); 
  mb->wt_ptr(len); 
  2.3 
  ACE_Message_Block* mb = new ACE_Message_Block(len, 
            ACE_Message_Block::MB_DATA, 
            mb2,   //表示 mb->cont(mb2) 
            buff) 
  mb->wt_ptr(len); 
3.让消息接成串cont()时,千万不要直接或接间的把它接成一个环 
   mb->cont(mb2); 
   mb2->cont(mb3); //ok 
   ***mb3->cont(mb);  //死定了 
4.通知其它线程结束时,可以通过ACE_Message_Block::MB_STOP 

  ACE_Message_Block* lastMsg =ACE_Message_Block ,ACE_Message_Block::MB_STOP) 
  otherTask->putq(lastMsg); 

  otherTask在接收到的时候如下处理 

 

     int  OtherTask::svc() 
   
  
          ACE_Message_Block
 *  mb; 
           
 while ( 1 
           
  
             getq(mb); 
            
 if (mb -> get_tpye()  ==  ACE_Message_Block::MB_STOP) 
           
  
              mb
 -> release(); 
              
 break  // 退出这个永久限环)  
 
           } 
 
           
 else  
           
  
              handle_message(mb); 
 // 处理这条消息  
 
           } 
 
   
 return   0 


    }
 
 
 

  4. 要学会用duplicate()方法,同时注意allocator和lock

抱歉!评论已关闭.