HarmonyOS鸿蒙Next中napi_call_threadsafe_function执行顺序

HarmonyOS鸿蒙Next中napi_call_threadsafe_function执行顺序 我遇见了napi_call_threadsafe_function执行乱序的情况

pasttask(a);
pasttask(b);
pasttask(c);

但是实际执行顺序是b a c

请问napi_call_threadsafe_function执行顺序是啥样的??

相关词:napi_threadsafe_function执行乱序,napi线程安全函数时序

3 回复

对于同一个napi_threadsafe_function来说,napi_call_threadsafe_function保序的,接口内维护了一个队列,先调用就会先执行。

我建议你排查一下几个方面:

  1. 是不是用的同一个napi_threadsafe_function,如果是不同的,那肯定保证不了顺序
  2. pasttask这个行为本身是不是异步的,如果是异步的,那call的实际都不一定是a-b-c
  3. 是不是用了napi_call_threadsafe_function_with_priority

使用Node-API接口从异步线程向ArkTS线程投递指定优先级和入队方式的的任务-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

更多关于HarmonyOS鸿蒙Next中napi_call_threadsafe_function执行顺序的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,napi_call_threadsafe_function用于在异步线程中调用线程安全函数。其执行顺序取决于线程安全函数的调用队列和事件循环机制。当调用napi_call_threadsafe_function时,函数会被放入队列中,等待事件循环处理。事件循环会按照队列顺序依次执行这些函数,确保线程安全。

在HarmonyOS Next中,napi_call_threadsafe_function的执行顺序并不保证与调用顺序完全一致。这是由于线程安全函数的本质特性决定的:

  1. 当主线程调用napi_call_threadsafe_function时,消息会被放入队列,由工作线程异步处理。
  2. 多个调用可能被批量处理,顺序可能受线程调度影响。
  3. 如果使用了NAPI_TSFN_NONBLOCKING模式,某些调用可能会被跳过。

建议解决方案:

  1. 如需严格顺序,可在JS层维护任务队列。
  2. 或使用napi_create_threadsafe_function时设置initial_thread_count=1,限制为单线程处理。
  3. 考虑在任务数据中加入序列号,在回调中手动排序。

这种乱序是设计使然,并非bug,需要根据业务场景选择适当的同步策略。

回到顶部