HarmonyOS 鸿蒙Next中使用taskpool.SequenceRunner,程序崩溃

HarmonyOS 鸿蒙Next中使用taskpool.SequenceRunner,程序崩溃

在使用taskpool.SequenceRunner开辟线程执行任务时,可以正常执行并且返回正确的值,但是放置大约30秒以后,会崩溃。

系统Log输出thread被释放,就会崩溃,请问是什么原因?

补充:下面的方法,直接用taskpool.execute一样会崩溃

实现代码:

@Concurrent

export async function taskWorker(): Promise<boolean> { return true; }

async executeThreadTask(): Promise<boolean> { try { const runner = new taskpool.SequenceRunner(“sequence-runner”); let task = new taskpool.Task(taskWorker, email); let ret = await runner.execute(task); return ret } catch (e) { } }

系统日志如下:

[(:82)(ReleaseWorkerHandles)] taskpool:: the thread is idle and will be released, and the total num is 0 now

ConnectServer SendReply: {“type”:“destroyInstance”,“instanceId”:28596,“name”:“workerThread_28596”,“tid”:28596,“apiType”:“stageMode”,“language”:“ets”}

StopDebug start, vm is <private>

WsServer StopServer

Failed to shutdown server socket, errno = 9

Close connection, status = 1001

Failed to shutdown client socket, errno = 13

StopDebug end

[(native_engine.cpp:179)(Deinit)] NativeEngine::Deinit

[(native_safe_async_work.cpp:303)(ProcessAsyncHandle)] clean up handles in loop(392546353152)

loop:(392546353152) closed in 0s

close:392546353152, async_io_wfd:74

close:392546353152, backend_fd:68

[(native_engine.cpp:104)(~NativeEngine)] NativeEngine::~NativeEngine

崩溃日志信息:

Reason:Signal:SIGSEGV(SEGV_ACCERR)@0x0000002f5f240000

Fault thread info:

Tid:26170, Name:OS_GC_Thread

#00 pc 0000000000538c1c /system/lib64/platformsdk/libark_jsruntime.so(0d69a79f2a5bf79a69fb024e1aa5e02f)

#01 pc 000000000051f510 /system/lib64/platformsdk/libark_jsruntime.so(0d69a79f2a5bf79a69fb024e1aa5e02f)

#02 pc 0000000000536aec /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SharedGCMarker::ProcessMarkStack(unsigned int)+140)(0d69a79f2a5bf79a69fb024e1aa5e02f)

#03 pc 0000000000500538 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::SharedHeap::ParallelMarkTask::Run(unsigned int)+72)(0d69a79f2a5bf79a69fb024e1aa5e02f)

#04 pc 000000000065ecc0 /system/lib64/platformsdk/libark_jsruntime.so(panda::ecmascript::Runner::Run(unsigned int)+188)(0d69a79f2a5bf79a69fb024e1aa5e02f)

#05 pc 000000000065ed90 /system/lib64/platformsdk/libark_jsruntime.so(0d69a79f2a5bf79a69fb024e1aa5e02f)

#06 pc 00000000001bdcac /system/lib/ld-musl-aarch64.so.1(start+236)(f77c0346c0084ebbadf721ea319f5f77)


更多关于HarmonyOS 鸿蒙Next中使用taskpool.SequenceRunner,程序崩溃的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

自己排查清楚了,希望对有一样问题的道友提供点帮助

原因是某个export的类有@Sendable修饰符,同时是一个共享类(标记了 “use shared”),问题在于在这个类的最顶端export了一个枚举,将枚举删掉即可

更多关于HarmonyOS 鸿蒙Next中使用taskpool.SequenceRunner,程序崩溃的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中使用taskpool.SequenceRunner崩溃可能由以下原因导致:

  1. 任务序列未正确初始化
  2. 任务函数中存在未捕获异常
  3. 跨线程访问UI组件
  4. 任务依赖关系形成循环
  5. 系统资源耗尽

检查点:

  • 确保所有任务函数都有try-catch
  • 验证任务依赖关系无循环
  • 使用DevEco Studio的异常捕获工具
  • 检查任务序列配置参数

典型错误日志特征: “SequenceRunner abort"或"Task execution failed”,

从日志和代码分析,这个问题是由于HarmonyOS Next的taskpool线程管理机制导致的。关键点如下:

  1. 日志显示"the thread is idle and will be released"表明系统在30秒空闲后自动回收了线程资源,这是taskpool的默认行为。

  2. SIGSEGV(SEGV_ACCERR)错误发生在GC线程尝试访问已释放的内存,说明线程回收后仍有对象被引用。

  3. 解决方案建议:

  • 确保所有taskpool任务完成后及时释放资源
  • 检查是否有全局变量持有runner或task的引用
  • 考虑使用taskpool.cancel()显式取消任务
  • 如果确实需要长时间运行,建议改用Worker而非taskpool
  1. 代码层面可以添加资源清理:
async executeThreadTask(): Promise<boolean> {
  let runner;
  try {
    runner = new taskpool.SequenceRunner("sequence-runner");
    let task = new taskpool.Task(taskWorker, email);
    return await runner.execute(task);
  } finally {
    runner?.cancel(); // 显式释放资源
  }
}

这个问题本质上是由于异步任务生命周期管理不当导致的资源访问冲突。

回到顶部