【HarmonyOS NEXT】如何通过NAPI napi_call_threadsafe_function接口实现跨线程获取数据

文章讨论了如何在Node.js环境中通过napi_create_threadsafe_function实现线程安全地调用C++库,解决跨线程数据传递问题。作者分享了一个示例代码,展示了如何正确设置和调用线程安全函数以获取跨线程传递的用户数据。

 

【关键字】

Node-API / 线程安全开发 / napi_call_threadsafe_function / 跨线程获取数据

【问题描述】

项目中需要对接一个C++库,这个库的所有处理逻辑都在它的子线程里,并不在NAPI的主线程,因此涉及到跨线程的问题。假定主线程为线程A,三方库子线程为线程B。

1、调用napi_create_threadsafe_function方法,注入线程安全的方法callProxyFunction。该方法按照nodejs文档要求的方法签名,定义为static void callProxyFunction(napi_env env, napi_value js_callback, void *context, void *data)。其中第四个参数*data就是给调用该函数的地方植入自定义数据。

2、将第一步创建的callProxyFunction方法绑定到napi_threadsafe_function callProxySafeThreadHandle上。

3、在B线程中调用napi_call_threadsafe_function(callProxySafeThreadHandle, params, napi_tsfn_nonblocking),其中params参数就是植入自定义数据的地方。

4、A线程的callProxyFunction方法被napi主动调用。此时第四个参数*data,按照预想逻辑,应该可以获取第3步的params参数。实际上,经过调试地址确实是一样的,但是数据全部为空,似乎有跨线程问题。

因此想要咨询下,框架有没有提供什么方法可以获取第3步里传递的用户数据?

【解决方案】

经验证,可以跨线程获取数据,以下为示例代码。

  • hello.cpp:

    #include "napi/native_api.h"
    #define LOG_TAG "testTag"
    #include <hilog/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值