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 |