---
title: 多线程支持
description: "WD算法层支持同步调用和异步调用，线程模型如图1所示"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/252RC1/accel/kunpengaccel_17_0022.html
sourcePath: /source/zh/kunpengboostkithistory/252RC1/accel/kunpengaccel_17_0022.html
indexId: b537f9c0afa89db89058f9fb6c1df7a4be738f22aed00569503656904392a57272
---
# 多线程支持

WD算法层支持同步调用和异步调用，线程模型如图1所示

图1 WD算法层线程模型

上图中，序号3的回调函数中可以再创建线程执行耗时较长的任务，避免阻塞。


线程模型

- 同步调用的情况下，每个线程用一个Context作为上下文通过wd_send发送请求，这些请求进入queue之后，该线程基于Context通过wd_recv循环查询数据是否处理完成。处理流程和  2.2.3.1默认流程
中顺序调用步骤一致，伪代码可以参考  接口使用示例
。
- 异步调用的情况下，可以使用任意线程把Context作为上下文调用wd_send，同时建立一个poll线程调用算法层的poll接口，如果有数据处理完，就找出Context并调用该Context的回调函数，回调函数中可以再创建线程执行耗时较长的任务，避免阻塞。还是以HASH算法为例，处理流程和同步流程的用法如下，伪代码可以参考  接口使用示例
。

1. 申请队列前，和  默认场景
一样，声明一个struct wd_queue的结构体变量并在这个成员变量capa的成员变量alg中指定需要的算法字符串。
2. 申请队列时，和  默认场景
一样，取第1步struct wd_queue结构体变量的地址作为参数，调用int wd_request_queue(struct wd_queue *q)申请指定算法的队列。
3. 创建算法context时，和  默认场景
一样，调用wcrypto_create_digest_ctx函数创建context。
4. 调用算法操作前，和  默认场景
一样，声明一个该算法的操作结构体struct wcrypto_digest_op_data变量，设置好成员in、out、in_bytes、out_bytes等。处理完之后由用户负责释放。
5. 调用算法操作前，定义好回调函数，用于处理硬件返回的数据。回调函数中可以再创建线程执行耗时长的任务，避免阻塞其他任务。
6. 调用算法操作前，定义好poll线程的函数，函数中需要调用wcrypto_digest_poll函数。wcrypto_digest_poll中将通过WD基础层recv接口将硬件处理好的数据填到第4步声明的struct wcrypto_digest_op_data变量的成员变量out中，再根据context调用定义的回调函数。
7. 调用算法操作前，建立一个poll线程，并把struct wd_queue结构体变量的地址作为参数给该线程函数。
8. 调用算法操作时，取第3步返回的context指针、第4步struct wcrypto_digest_op_data变量地址和把第5步定义好的回调函数作为参数，调用wcrypto_do_digest函数将数据通过WD基础层send接口交给加速器硬件，成功则返回0；失败则返回负值。
9. 释放算法context时，取第3步返回的context指针作为参数，调用wcrypto_del_digest_ctx函数释放context。
10. 待poll线程接收数据并调用回调函数，回调函数处理完加速器返回的数据之后，释放struct wcrypto_digest_op_data变量涉及到的in、out内存。
11. 释放队列时，等待线程结束后，取第1步struct wd_queue结构体变量的地址作为参数，调用void wd_release_queue(struct wd_queue *q)释放队列和涉及到的硬件资源。
