---
title: HcclThreadAcquire
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/programug/commopdev/hcclopdevapi_07_0051.html
sourcePath: /source/zh/canncommercial/900/programug/commopdev/hcclopdevapi_07_0051.html
indexId: 213c644f65bc127ad303bdf90c47a58afd2066c9491a5e02fee6148d57b83ad175
---
# HcclThreadAcquire

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | √ |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | ☓ |
| Atlas 推理系列产品 | ☓ |
| Atlas 训练系列产品 | ☓ |


针对 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 ，仅支持Atlas 800T A2 训练服务器、Atlas 900 A2 PoD 集群基础单元、Atlas 200T A2 Box16 异构子框。


#### 功能说明

基于通信域获取通信线程。


#### 函数原型

```
HcclResult HcclThreadAcquire(HcclComm comm, CommEngine engine, uint32_t threadNum, uint32_t notifyNumPerThread, ThreadHandle *threads)
```


#### 参数说明

| 参数名 | 输入/输出 | 描述 |  |  |
| --- | --- | --- | --- | --- |
| comm | 输入 | 通信域。 HcclComm类型的定义如下： 1 typedef void \*HcclComm; | 1 | typedef void \*HcclComm; |
| 1 | typedef void \*HcclComm; |  |  |  |
| engine | 输入 | 通信引擎类型。 CommEngine类型的定义可参见CommEngine。 |  |  |
| threadNum | 输入 | 通信线程数量。一个通信域内最多申请40条流。 |  |  |
| notifyNumPerThread | 输入 | 每个通信线程中的同步资源（Notify）数量。一个通信域内最多申请64个同步资源。 |  |  |
| threads | 输出 | 返回的通信线程句柄。需传入threadNum大小的ThreadHandle类型数组。 ThreadHandle类型的定义可参见ThreadHandle。 |  |  |


#### 返回值

HcclResult：接口成功返回HCCL_SUCCESS，其他失败。


#### 约束说明

返回的通信线程与同步资源由库内管理，调用者严禁释放。


#### 调用示例

创建线程资源示例如下：

```
HcclComm comm;
CommEngine engine = COMM_ENGINE_AICPU_TS;
ThreadHandle threads[5];
// 申请5条流，每条流2个notify
HcclThreadAcquire(comm, engine, 5, 2, threads);
```

同步Host线程资源示例如下：

```
// 申请1条host流
aclrtStream stream;
aclrtCreateStream(&stream);
// 根据申请的流创建CPU_TS类型thread
ThreadHandle cpuThread;
HcclThreadAcquireWithStream(comm, COMM_ENGINE_CPU_TS, streams, 1, &cpuThread);
// 任务编排
// ...
// 流同步
aclrtSynchronizeStream(stream);
```

同步AICPU线程资源示例如下：

```
// --host侧调用流程--
// 申请1条host流
aclrtStream stream;
aclrtCreateStream(&stream);
// 根据申请的流创建CPU_TS类型thread
ThreadHandle cpuThread;
HcclThreadAcquireWithStream(comm, COMM_ENGINE_CPU_TS, streams, 1, &cpuThread);
// 创建一个AICPU_TS类型的thread
ThreadHandle aicpuThread;
HcclThreadAcquire(comm, COMM_ENGINE_AICPU_TS, 1, 1, &aicpuThread);
// 把创建的AICPU_TS类型的thread导出为CPU上可用的thread
ThreadHandle exportedCpuThread;
HcclThreadExportToCommEngine(comm, 1, &aicpuThread, COMM_ENGINE_CPU_TS, &exportedCpuThread);
// 把创建的CPU类型的thread导出为AICPU上可用的thread
ThreadHandle exportedAicpuThread;
HcclThreadExportToCommEngine(comm, 1, &cpuThread, COMM_ENGINE_AICPU_TS, &exportedAicpuThread);
// 发送同步信号
HcommThreadNotifyRecordOnThread(cpuThread, exportedCpuThread, 0);
// 下发kernel，把exportedAicpuThread，aicpuThread带到aicpu侧
// ...
uint32_t timeout = 1;
// 等待同步信号
HcommThreadNotifyWaitOnThread(cpuThread, 0, timeout);
// --aicpu侧调用流程--
// 等待同步信号
uint32_t timeout = 1;
HcommThreadNotifyWaitOnThread(aicpuThread, 0, timeout);
// 任务编排，将任务下发到aicpuThread
// ...
// 发送同步信号
HcommThreadNotifyRecordOnThread(aicpuThread, exportedAicpuThread, 0);
// 流同步
aclrtSynchronizeStream(stream);
```
