HarmonyOS鸿蒙Next中在线程A使用napi_create_reference创建的ref如何在线程B中使用

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS鸿蒙Next中在线程A使用napi_create_reference创建的ref如何在线程B中使用 在线程A使用 napi_create_reference 创建的ref,如何在线程B中使用

4 回复

不好意思,可能我没描述清楚。是这样的:

我在主线程使用

napi_create_reference

创建了一个refA,然后在c++层创建了一个线程B,并且在该线程通过

napi_create_ark_runtime

创建了一个ark环境。

当我在B线程使用refA,会崩溃,提示是"param env is not equal to its owner",我记得同样用法在5.0.0.102系统版本上只是警告而已,不会崩溃。

现在最新系统版本5.0.0.115上会报崩溃具体信息:

Reason:Signal:SIGABRT(SI_TKILL)@0x01317b5b00001765 from:5989:20020059
LastFatalMessage:[(ark_native_reference.cpp:117)(Get)] param env is not equal to its owner

请问如何在B线程使用refA

更多关于HarmonyOS鸿蒙Next中在线程A使用napi_create_reference创建的ref如何在线程B中使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Button(“跨线程调用 JS 函数”) .onClick(() => { entry.threadsTest((value:number) => { value += 10 this.cnt += 20 hilog.info(0x0000, ‘testTag’, ‘js callback value =’ + value + ", cnt = " + this.cnt); return value }) }).margin(10)

// 从 ArkTS 侧获取的参数的数量 size_t argc = 1; napi_value js_cb, work_name;

// 获取 ArkTS 参数 napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr);

在HarmonyOS鸿蒙Next中,napi_create_reference创建的引用(ref)是线程绑定的,意味着它只能在创建它的线程中使用。如果要在线程B中使用线程A创建的引用,需要通过napi_threadsafe_function机制来实现线程间通信。

具体步骤如下:

  1. 在线程A中,使用napi_create_reference创建引用。
  2. 使用napi_create_threadsafe_function创建一个线程安全函数,并将引用作为上下文传递给该函数。
  3. 在线程B中,调用napi_call_threadsafe_function来执行线程安全函数,并传递所需的参数。
  4. 在线程安全函数的回调中,可以通过napi_get_reference_value获取到线程A中创建的引用,并在线程B中使用它。

需要注意的是,napi_threadsafe_function提供了线程安全的调用机制,确保在不同线程间安全地传递和使用数据。

在HarmonyOS鸿蒙Next中,napi_create_reference创建的引用是线程绑定的,不能直接在线程B中使用。如果需要在多线程间共享引用,可以通过以下方式实现:

  1. 共享资源:将引用存储在共享资源(如全局变量或线程间通信机制)中。
  2. 跨线程传递:通过napi_create_threadsafe_function创建线程安全函数,在线程B中调用该函数并使用引用。
  3. 序列化与反序列化:将引用序列化为数据格式,在线程B中反序列化后使用。

确保在多线程环境下正确处理引用,避免资源泄露或数据竞争。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!