HarmonyOS鸿蒙Next中使用napi_create_async_work进行开发时,出现cppcrash崩溃

HarmonyOS鸿蒙Next中使用napi_create_async_work进行开发时,出现cppcrash崩溃

我这边有个场景,使用队列和napi_create_async_work的形式实现了在子线程顺序执行任务,但是发现存在崩溃,查看堆栈发现有同时存在很多子线程都在执行异步任务。

想问一下:

  1. napi_create_async_work的线程模型是什么样的,为啥是很多子线程一起做任务,而不是同一个子线程顺序执行?

  2. 我遇见了cppcrash崩溃问题,请问如何解决

相关词:napi_create_async_work线程模型,napi_create_async_work崩溃,napi_create_async_work线程关系,napi_create_async_work子线程


```javascript
#00 /data/.......包内我自己的so
#01 /data/.......包内我自己的so
#02 /data/.......包内我自己的so
#03 /data/.......包内我自己的so
#04 /system/lib/platformsdk/libace_napi.z.so(NativeAsyncWork::AsyncWorkCallback)
#05 /system/lib/platformsdk/libuv.so

更多关于HarmonyOS鸿蒙Next中使用napi_create_async_work进行开发时,出现cppcrash崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复
  1. napi_create_async_work线程模型可以参考下面这篇文档,他会从uv的线程池中拿出子线程一起执行任务。

使用Node-API接口进行异步任务开发-Node-API典型使用场景-使用Node-API实现跨语言交互-代码开发-NDK开发 - 华为HarmonyOS开发者

所以,如果你有顺序要求的话,我更推荐你使用napi_threadsafe_function系列的接口,这个是保序的。napi_create_async_work不保序。

  1. 对于崩溃栈,多半是uaf问题,即napi_create_async_work创建出async_work,这个async_work通过napi_queue_async_work被扔进任务池中,但是执行之前,有其他地方把async_work给delete了(通过napi_delete_asynv_work接口),可以参考下面这篇文档,和你是类似的。

易错API的使用规范-稳定性编码规范-稳定性优化-稳定性-应用质量 - 华为HarmonyOS开发者

更多关于HarmonyOS鸿蒙Next中使用napi_create_async_work进行开发时,出现cppcrash崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中使用napi_create_async_work进行开发时遇到cppcrash崩溃,通常是由于异步任务的上下文管理不当或内存访问越界所致。确保在创建和执行异步任务时,正确管理资源生命周期,避免跨线程访问未同步的数据。检查napi_create_async_work的参数是否正确,尤其是回调函数和上下文对象。使用调试工具定位具体崩溃点,确认是否有未捕获的异常或资源泄漏。

关于HarmonyOS Next中使用napi_create_async_work的线程模型和崩溃问题:

  1. 线程模型说明: napi_create_async_work默认使用libuv的线程池机制,该线程池默认包含4个工作线程。当有多个异步任务时,这些任务会被分配到不同的线程并行执行,而不是在单一子线程顺序执行。这是设计上的特性,目的是提高并发性能。

  2. cppcrash崩溃可能原因: 从堆栈看崩溃发生在AsyncWorkCallback中,常见原因包括:

  • 多线程并发访问共享数据未加锁
  • 在回调中访问了已释放的JS对象
  • 任务队列处理逻辑存在竞态条件
  1. 解决方案建议:
  • 检查所有共享数据的访问是否线程安全
  • 确保napi_value相关操作都在主线程执行
  • 使用napi_create_threadsafe_function处理跨线程JS调用
  • 检查任务队列的实现是否正确处理了多线程并发

建议提供更详细的崩溃日志和代码片段以便进一步分析具体问题原因。

回到顶部