---
title: 共享Buffer管理使用说明
description: "本特性提供了跨进程共享Buffer管理能力，可配合共享队列管理一起使用。共享Buffer的共享范围由共享队列的授权确定，共享范围包括“一主多从”的这些进程。"
url: https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/latest/API/runtimeapi/aclcppdevg_03_2199.html
sourcePath: /source/zh/CANNCommunityEdition/920beta1/API/runtimeapi/aclcppdevg_03_2199.html
indexId: 5ee3cb6a0a2f6c146a481446c95e8087ae66f7b6321ab762e172aba1bb33950479
---
# 共享Buffer管理使用说明

本特性提供了跨进程共享Buffer管理能力，可配合共享队列管理一起使用。共享Buffer的共享范围由共享队列的授权确定，共享范围包括“一主多从”的这些进程。

#### 接口调用流程


关键接口的调用流程如上图所示，流程说明如下：

1. 调用aclInit接口初始化系统。
2. 调用aclrtSetDevice接口指定计算设备。
3. 申请共享Buffer内存。
  调用acltdtAllocBuf接口申请共享Buffer内存，此处需根据实际情况选择内存类型。

4. 向共享Buffer中填充有效数据。
  需先调用acltdtGetBufData接口获取共享Buffer的数据区指针和数据区长度，接着调用aclrtMemcpy接口把用户数据复制到共享Buffer中，最后可调用acltdtSetBufDataLen接口设置有效数据长度，以便在多进程场景下调用acltdtGetBufDataLen接口获取有效数据长度，再根据有效数据长度获取共享Buffer中的数据。

5. 设置共享Buffer的私有数据区数据。
  调用acltdtSetBufUserData接口设置共享Buffer的私有数据区数据，以便在多进程场景下调用acltdtGetBufUserData接口获取共享Buffer的私有数据区数据。

6. 释放共享Buffer内存。
  调用acltdtFreeBuf接口来释放共享Buffer。

7. 调用aclrtResetDevice接口复位设备，释放Device上的资源。
8. 调用aclFinalize接口实现系统去初始化，用于释放进程内acl接口使用的相关资源。


#### 示例代码

以下是关键步骤的代码示例，不能直接拷贝编译运行，仅供参考。调用接口后，需增加异常处理的分支，并记录报错日志、提示日志，此处不一一列举。

```
#include "acl/acl.h"

// 1. 初始化
// 此处的..表示相对路径，相对可执行文件所在的目录
// 例如，编译出来的可执行文件存放在out目录下，此处的..就表示out目录的上一级目录
const char *aclConfigPath = "../src/acl.json";
aclError ret = aclInit(aclConfigPath);

// 2. 运行时资源申请，指定计算设备，此处以deviceId = 0为例
ret = aclrtSetDevice(0);

// 3. 申请mbuf内存并进行内存管理，此处以申请DVPP内存、内存大小1024U为例
size_t size = 1024U; 
acltdtBuf buf; 
ret = acltdtAllocBuf(size, ACL_TDT_DVPP_MEM, &buf);

// 4. 向共享Buffer中填充有效数据
// 4.1 获取共享Buffer的数据区指针和数据区长度
void *dataPtr = nullptr;
size_t dataSize = 0U;
ret = acltdtGetBufData(buf, &dataPtr, &dataSize);

// 4.2 把用户数据拷贝到共享Buffer中
size_t len = 512U; // 用户数据长度
void *ptr = new (std::nothrow) char_t[len];  // 用户申请自己的内存
// 用户对自己申请的数据进行处理
//……
ret = aclrtMemcpy(dataPtr, size, ptr, len, ACL_MEMCPY_HOST_TO_DEVICE);
// 5. 释放内存
delete[] ptr;
ptr = nullptr;
delete[] newPtr;
newPtr = nullptr;
ret = acltdtFreeBuf(buf);

// 6. 运行时资源释放
ret = aclrtResetDevice(0);

// 7.  去初始化
ret = aclFinalize();
```
