ACE学习笔记(二)--消息队列(简介)

来源:互联网 发布:.商标域名注册官网 编辑:程序博客网 时间:2024/05/16 10:13
    在ACE中,消息作为消息块(Message Block)被放入消息队列中。每个消息块“(类名为ACE_Message_Block)包含”一个头和一个数据块。它持有指向两者的指针,包含只是逻辑上的。数据块(类名为ACE_Data_Block)持有指向实际的数据缓冲区的指针。这样的设计带来了多个消息块之间的数据的灵活共享,无需带来数据拷贝的开销就可以将同一数据放入不同的队列中。
ACE_Message_Block的构造器:
ACE_Message_Block的构造器为:
ACE_Message_Block (size_t size,    
//数据缓冲区大小
ACE_Message_Type type = MB_DATA, //消息类型
ACE_Message_Block *cont = 0,    //指向“片段链”中的下一个消息块的指针,缺省值为0,表示不使用链
const char *data = 0,    //指向要存储在此消息块中的数据缓存区的指针,若为0,则根据 size创建缓存区,并由该消息块管理,同生死
                                      
//若不为空,消息块被销毁时它不会删除数据缓存区。牢记!!!
ACE_Allocator *allocator_strategy = 0,   //分配数据缓存的分配策略,在第四个参数为空时使用
ACE_Lock *locking_strategy = 0,         //锁策略,不为0,用于保护访问共享状态的代码区
u_long priority = 0,                                //这三个参数用于ACE中的实时消息队列的调度,保留缺省值
const ACE_Time_Value & execution_time = ACE_Time_Value::zero,
const ACE_Time_Value & deadline_time = ACE_Time_Value::max_time);

 消息块的构造器允许:创建并传入你自己的指向消息数据的数据块、传入指向消息数据的指针,消息块将创建并设置底层的数据块。
下面的例子岩石怎样将指向消息数据的指针传给消息块,以及ACE_Message_Block怎样创建和管理底层的ACE_Data_Block:
//数据块
char data[size];
data 
= "This is my data";
//创建消息块去管理数据块
ACE_Message_Block *mb = new ACE_Message_Block(data,blocksize)
该构造器创建底层数据块,并将它设置为指向传递给它的数据的开头。被创建的消息块并不拷贝该数据,也不假定自己拥有它的所有权。这就意味着在消息块mb被销毁时,相关联的数据缓冲区data将不会被销毁。这是有意义的:消息块没有拷贝数据,因此内存也不是它分配的,这样它也不应该负责销毁它。