HarmonyOS 使用taskPool引起崩溃?
有一个解压缩的操作想放到子线程执行,使用pako来解压:
@Concurrent
export async function doInflate(data: Uint8Array): Promise<Uint8Array> {
let pako: ESObject = await import('pako')
let res: Uint8Array = pako.inflate(data)
return res
}
在主线程执行:taskpool.execute(doInflate, data)。大概有10个文件,只会在一开始将每个文件解压一次,后续不会再执行这个解压操作。一开始运行正常,但是持续运行4分钟左右就会出现崩溃。如果把这个解压操作放在主线程就不会崩溃。从日志看起来,是OS_TaskWorker线程崩了。监控发现内存很稳定也没有一直涨。这是什么原因引起的崩溃。
hilog崩溃日志如下:
04-12 14:57:38.755 31626-31693 C03F00/MUSL-SIGCHAIN com.test.demo E signal_chain_handler call 2 rd sigchain action for signal: 11
04-12 14:57:38.923 31626-31635 C057C7/BinderConnector com.test.demo E [nodict]WriteBinder 491: ioctl_binder returned EINTR
04-12 14:57:38.929 31626-31636 C057C7/BinderConnector com.test.demo E [nodict]WriteBinder 491: ioctl_binder returned EINTR
04-12 14:57:38.934 31626-31640 C057C7/BinderConnector com.test.demo E [nodict]WriteBinder 491: ioctl_binder returned EINTR
04-12 14:57:38.947 31626-31667 C057C7/BinderConnector com.test.demo E [nodict]WriteBinder 491: ioctl_binder returned EINTR
04-12 14:57:39.894 31626-31693 C03F00/MUSL-SIGCHAIN com.test.demo E signal_chain_handler call usr sigaction for signal: 11
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]<<<=== ffrt black box(BBOX) start ===>>>
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]<<<=== current status ===>>>
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]<<<=== task counter ===>>>
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]FFRT BBOX TaskSubmitCounter:1600 TaskEnQueueCounter:1600 TaskDoneCounter:916
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]FFRT BBOX TaskRunCounter:1954 TaskSwitchCounter:354 TaskFinishCounter:1600
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]FFRT BBOX TaskWakeCounterInc:0, TaskPendingCounter:0
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]TaskRunCounter equals TaskSwitchCounter + TaskFinishCounter
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]<<<=== worker status ===>>>
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]<<<=== ready queue status ===>>>
04-12 14:57:39.897 31626-35429 C01719/ffrt com.test.demo E [nodict]<<<=== ffrt black box(BBOX) finish ===>>>
04-12 14:57:39.898 31626-31693 C03F00/MUSL-SIGCHAIN com.test.demo E signal_chain_handler call 2 rd sigchain action for signal: 11
04-12 14:57:39.898 31626-31693 C03F00/MUSL-SIGCHAIN com.test.demo E signal_chain_handler SIG_DFL handler for signal: 11
04-12 14:57:39.899 31626-31693 C03F00/MUSL-SIGCHAIN com.test.demo E pid(31626) rethrow sig(11) success.
如果在taskPool中执行的任务尝试直接访问或修改UI组件,可能会导致崩溃,因为UI组件通常只能在主线程(UI线程)上被访问或修改。