`

ACE_Message_Block功能简介

    博客分类:
  • ACE
OS 
阅读更多

ACE_Message_Block在Ace中用来表示消息的存放空间,可用做网络通信中的消息缓冲区,使用非常频繁,下面将在如下方简单的介绍一下ACE_Message_Block相关功能。

  1. 创建消息块
  2. 释放消息块
  3. 从消息块中读写数据
  4. 数据的拷贝
  5. 其它常用函数

1。创建消息块

创建消息块的方式比较灵活,常用的有以下几种方式 :

1。直接给消息块分配内存空间创建。

    ACE_Message_Block *mb = new ACE_Message_Block (30);

2。共享底层数据块创建。

    char buffer[100];
    ACE_Message_Block *mb = new ACE_Message_Block (buffer,30);

这种方式共享底层的数据块,被创建的消息块并不拷贝该数据,也不假定自己拥有它的所有权。在消息块mb被销毁时,相关联的数据缓冲区data将不会被销毁。这是有意义的:消息块没有拷贝数据,因此内存也不是它分配的,这样它也不应该负责销毁它。

3。通过duplicate()函数从已有的消息块中创建副本。

    ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_Message_Block *mb2 = mb->duplicate();

这种方式下,mb2和mb共享同一数据空间,使用的是ACE_Message_Block的引用计数机制。它返回指向要被复制的消息块的指针,并在内部增加内部引用计数

4。通过clone()函数从已有的消息块中复制。

    ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_Message_Block *mb2 = mb->clone();

clone()方法实际地创建整个消息块的新副本,包括它的数据块和附加部分;也就是说,这是一次"深拷贝"。

2。释放消息块

一旦使用完消息块,程序员可以调用它的release()方法来释放它。

  1. 如果消息数据内存是由该消息块分配的,调用release()方法就也会释放此内存。
  2. 如果消息块是引用计数的,release()就会减少计数,直到到达0为止;之后消息块和与它相关联的数据块才从内存中被移除。
  3. 如果消息块是通过共享已分配的底层数据块创建的,底层数据块不会被释放。

无论消息块是哪种方式创建的,只要在使用完后及时调用release()函数,就能确保相应的内存能正确的释放。

3。从消息块中读写数据

ACE_Message_Block提供了两个指针函数以供程序员进行读写操作,rd_ptr()指向可读的数据块地址,wr_ptr()指向可写的数据块地址,默认情况下都执行数据块的首地址。下面的例子简单了演示它的使用方法。

#include "ace/Message_Queue.h"
#include "ace/OS.h"

int main(int argc, char *argv[]) 
{
    ACE_Message_Block *mb = new ACE_Message_Block (30);
    ACE_OS::sprintf(mb->wr_ptr(),"%s","hello");
    ACE_OS::printf("%s\n",mb->rd_ptr ());
    mb->release();
    return 0; 
}
 

注意:这两个指针所指向的位置并不会自动移动,在上面的例子中,函数执行完毕后,执行的位置仍然是最开始的0,而不是最新的可写位置5,程序员需要通过wr_ptr(5)函数手动移动写指针的位置。

4。数据的拷贝

一般的数据的拷贝可以通过函数来实现数据的拷贝,copy()还会保证wr_ptr()的更新,使其指向缓冲区的新末尾处。

下面的例子演示了copy()函数的用法。

    mb->copy("hello");
    mb->copy("123",4);

注意:由于c++是以'\0'作为字符串结束标志的,对于上面的例子,底层数据块中保存的是"hello\0123\0",而用ACE_OS::printf("%s\n",mb->rd_ptr ());打印出来的结果是"hello",使用copy函数进行字符串连接的时候需要注意。

5。其它常用函数

  1. length()    返回当前的数据长度
  2. next()    获取和设置下一个ACE_Message_Block的链接。(用来建立消息队列非常有用)
  3. space()    获取剩余可用空间大小
  4. size()    获取和设置数据存储空间大小。

小结:

分享到:
评论

相关推荐

    ACE-Message-Block.rar_ACE

    从提供的文件名称列表可以看出,有许多博客文章详细介绍了`ACE_Message_Block`的使用和实现,包括其功能、工作原理以及在实际项目中的应用。这些资源可以帮助开发者更深入地理解和使用`ACE_Message_Block`。 总结...

    analysis of ACE_Task-putq with timeout=0 when queue is full on Linux platform.pdf

    int putq(ACE_Message_Block*, ACE_Time_Value *timeout = 0); ``` 根据注释可知,如果`timeout`为0并且队列已满,则调用者会阻塞直到可以执行操作(例如,信号的发生)。在此期间,调用不会返回,除非进程被终止。...

    ACE编程(linux平台)归类.pdf

    `ACE_Message_Block`是ACE中的一个核心组件,用于存储和传递数据。它支持动态内存管理,可以通过`copy`或`wr_ptr`方法写入数据,并通过`rd_ptr`读取。使用完`ACE_Message_Block`后,必须调用`release`方法来减少...

    ACE编程(linux平台)借鉴.pdf

    ACE_Message_Block是一种动态缓冲区,可用于线程间的数据共享,支持写入和读取操作,并带有引用计数机制,确保正确释放内存。 为了防止死锁,ACE库引入了守卫(Guard)类,如ACE_Guard<ACE_Thread_Mutex>。守卫在...

    ACE简单例子 并附说明

    - **消息存储模型:ACE_Message_Block**:消息存储模型提供了对消息的封装和管理,支持复杂的消息传递需求。 - **消息队列:ACE_Message_Queue_Ex**:消息队列模型是用于消息传递的重要组件,支持先进先出(FIFO)原则...

    ACE编程(linux平台)[归类].pdf

    5. **ACE_Message_Block的使用**:`ACE_Message_Block`是一个内存管理工具,用于在多线程环境中安全地存储和传递数据。它可以动态分配内存,写入数据,并且通过引用计数管理内存释放。使用`release()`方法减少使用...

    ACE开发指南

    - **ACE_Message_Block**:用于存储数据的类,支持异步操作。 - **ACE_Proactor**:核心类,管理异步I/O操作。 - **Acceptor-Connector框架**:在Proactor模式下实现客户端和服务端的连接管理。 - **ACE_Service_...

    开源利器ACE

    同时每个模块里面包括了两个 ACE_Task,一个负责读方向的处理,一个负责写方向的处理,同一个方向上的数据交换通过上一层或下一层的消息队列来完成,交换的数据是 ACE_Message_Block,每一层都可以修改该消息中的...

    C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns

    ACE_Message_Block类用于处理数据块,而ACE_Input_CDR和ACE_Output_CDR类则提供了数据的编码与解码机制,这些都是构建网络服务的基石。 第二部分深入探讨了面向对象的并发网络编程。该部分首先阐述了并发设计的维度...

    ACE开发指南(初级)

    - **ACE_Message_Block**:用于传输数据的容器。 - **ACE_Proactor**:管理异步I/O操作的核心类。 **4.2 前摄式Acceptor-Connector框架** - **ACE_Asynch_Acceptor**:用于异步地接受客户端连接。 - **ACE_Asynch...

    ACE网络编程模式比较

    Proactor模式在接收消息后,先将消息转化为消息块结构(ACE_Message_Block),再由处理函数处理。这种方式避免了在事件处理过程中的阻塞,提高了效率。 4. **半同步/半异步框架**: 适用于Proactor模式,主线程...

    UG6.0快捷键大全

    POPUP_MESSAGE Opens the Sketch task environment to edit the selected sketch. ACTIONS STANDARD END_OF_MENU MENU UG_MODELING_EDIT_FREEFORM BUTTON UG_MODELING_EDIT_FF_POLE_EDITING LABEL &X-Form....

    编译出错的VC ACE的MFC程序

    Block.cpp`、`Object_Manager.cpp`、`Basic_Types.cpp`、`OS_NS_unistd.cpp`、`OS_NS_stdlib.cpp`、`Message_Queue.cpp`等文件可能是项目的核心源代码,它们可能包含了ACE库的线程管理、消息队列、对象管理等关键...

    Windows2000操作系统.pptx

    文件和打印共享主要依赖SMB(Server Message Block)/NetBIOS/TCP/IP协议栈。NetBIOS处理共享名称的管理,SMB则负责实际的连接和数据传输。当使用TCP/IP作为底层协议时,SMB/NetBIOS可以在Internet上实现跨网络的...

Global site tag (gtag.js) - Google Analytics