HarmonyOS 鸿蒙Next NDK开发中的线程安全问题

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

HarmonyOS 鸿蒙Next NDK开发中的线程安全问题

  1. 文档中写“禁止通过Node-API跨引擎实例访问JS对象”,我了解到Stage模型中多个应用组件共享同一个虚拟机引擎。那是不是可以理解为:正常app开发中不会有多引擎的场景,即不会遇到多napi_env。

  2. 在以下这种场景中是否涉及线程安全问题 native侧的函数实现中操作static map后同步返回(返回状态码,与map无关),伪代码:

static napi_value Add(napi_env env, napi_callback_info info) {
    hashmap_set(map, k, v);
    return code_value;
}

js侧在并发网络请求的响应中调用该函数,伪代码:

request(url).then(() => nativeApi.add(a, b))
request(url).then(() => nativeApi.add(c, d))

期待答复时间: 一周


更多关于HarmonyOS 鸿蒙Next NDK开发中的线程安全问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
  1. 禁止通过NAPI跨引擎实例访问JS对象是指:

    • 引擎实例是一个独立运行环境,JS对象创建访问等操作必须在同一个引擎实例中进行。若在不同引擎实例中操作同一个对象,可能会引发程序崩溃。引擎实例在接口中体现为napi_env。

    错误示例:

    // 线程1执行,在env1创建string对象,值为"bar"、
    napi_create_string_utf8(env1, "bar", NAPI_AUTO_LENGTH, &string);
    // 线程2执行,在env2创建object对象,并将上述的string对象设置到object对象中
    napi_status status = napi_create_object(env2, &object);
    if (status != napi_ok) {
        napi_throw_error(env, ...);
        return;
    }
    status = napi_set_named_property(env2, object, "foo", string);
    if (status != napi_ok) {
        napi_throw_error(env, ...);
        return;
    }
    

    所有的JS对象都隶属于具体的某一napi_env,不可将env1的对象,设置到env2中的对象中。在env2中一旦访问到env1的对象,程序可能会发生崩溃

  2. 不涉及线程安全问题,但是需要考虑某些场景的内存泄漏问题,比如napi有些场景需要在创建对象前删除相关的引用

更多关于HarmonyOS 鸿蒙Next NDK开发中的线程安全问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next NDK开发中,线程安全问题主要涉及多线程环境下的资源访问和数据一致性。鸿蒙系统提供了多种机制来管理线程并保障线程安全。

  1. 互斥锁(Mutex):用于保护临界区,确保同一时刻只有一个线程能访问共享资源。鸿蒙NDK中可能提供了类似的互斥锁API,开发者需要在使用前后正确加锁和解锁。

  2. 条件变量:用于线程间的同步,一个线程可以在条件变量上等待,直到另一个线程通知它某个条件已经满足。这有助于管理线程间的依赖关系。

  3. 原子操作:对于简单的计数器或标志位,可以使用原子操作来保证线程安全,这些操作通常是硬件支持的,执行过程中不会被中断。

  4. 信号量:用于控制对资源的访问数量,比如一个资源池允许多少个线程同时访问。

  5. 读写锁:适用于读多写少的场景,允许多个线程同时读,但写时独占访问权。

开发者在选择使用这些机制时,应根据具体的应用场景和需求来决定。确保在多个线程访问共享资源时,通过适当的同步机制来避免数据竞争和不一致性问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部