ACE_Messae_Block中结合了ACE_Allocator,使ACE_Message_Block更加灵活,本文中将简单介绍ACE_Message_Block和ACE_Allocator的使用方法,及注意事项。
首先我们看看ACE_Message_Block的构着函数:
ACE_Message_Block(size_tsize,
ACE_Message_Typetype=MB_DATA,
ACE_Message_Block*cont=0,
constchar*data=0,
ACE_Allocator*allocator_strategy=0,
ACE_Lock*locking_strategy=0,
unsignedlongpriority=ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY,
constACE_Time_Value&execution_time=ACE_Time_Value::zero,
constACE_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_=newACE_Cached_Allocator<ACE_Message_Block,ACE_SYNCH_MUTEX>(MsgCount);
data_allocator_=newACE_Cached_Allocator<ACE_Data_Block,ACE_SYNCH_MUTEX>(BuffCount);
buff_allocator_=newACE_Cached_Allocator<MEM_BUF,ACE_SYNCH_MUTEX>(BuffCount);
查看ACE_Message_Block的代码,可以发现,在调用其Release方法时,会先检查是否使用分配其,如果没有使用,直接delete掉,如果使用了分配器,则把内存归还给分配器。
其中还必须注意一个参数,即locking_strategy,这是一把多线程同步的锁,其主要时在进行浅层拷贝或者release时进行线程安全控制。比如,在调用duplicate或者release时要增减引用计数器。
****1copy()不需要让写指针后移.
ACE_Message_Block*mb=newACE_Message_Block(BUFSIZ);
mb->copy(buff);//buff先已经初始化
2初始化mb后需要后移指针的情况
2.1
ACE_Message_Block*mb=newACE_Message_Block(buff,len);
mb->wt_ptr(len);//len是buff的长度len=strlen(buff)+1
//+1表示后面的/0
2.2
ACE_Message_Block*mb=newACE_Message_Block(BUFSIZ);
ACE_OS::sprintf(mb->wt_ptr(),buff);
mb->wt_ptr(len);
2.3
ACE_Message_Block*mb=newACE_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在接收到的时候如下处理
intOtherTask::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);//处理这条消息
}
return0;
}
4.要学会用duplicate()方法,同时注意allocator和lock
相关推荐
ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txtACE_Thread.txt ACE_Thread.txt ACE_Thread.txt ACE_Thread.txt
一系列介绍ACE_Message_Block功能的资料
HI0022E_amba_axi_and_ace_protocol_spec.pdfHI0022E_amba_axi_and_ace_protocol_spec.pdf
* Convert this second count back into a time block structure. * If localtime returns NULL, return an error. */ if ( _localtime64_s(&tbtemp;, &tmptm1;) != 0 ) goto err_mktime; /* * Now must ...
ACE_wrappers22222222
ACE_wrappers11111111
ACE_wrappers 5.7类库 使用CodeBlocks 8.02 gcc 3.4.5编译的Release版本 文件列表 libACE.dll.a,libACE.dll,libACE_ETCL.dll,libACE_ETCL_Parser.dll,libACE_Monitor_Control.dll
ACE_OS命名空间函数参考文档 用ACE跨平台最常用的系统函数
使用ACE_Proactor进行TCP通信的示例代码。
ACE_Proactor TCP协议通信示例代码
一个ACE写的服务器端,可以连接多个用户,并处理其请求
使用ACE 搭建的TCP服务器和客户端框架。简洁明了,可以扩充。
ACE JS lite framework | 轻量级JS核心开发框架
ACE默认生成的库是标准库版,现在有生成好了的ACE的MFC版本,实用于VC++2005
axi协议官方版,适合学习axi4,axi3 axilite axistream的学生和工程师研究学习
ACE数据的传输,使用ACE代码编写,实现数据的传输
2016 最近版本的ace-admin 1.3.4 亲测通过,给个好评
ACE网络层 单独拿出来用 有需要的可以试试看
ACE测试程序,使用ACE_Time_Value和ACE_Get_Opt进行ACE环境搭建和测试