HarmonyOS 鸿蒙Next lockasync偶发捕获到异常

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

HarmonyOS 鸿蒙Next lockasync偶发捕获到异常 鸿蒙目前没有线程安全容器(虽然有隔离,但可用sendable共享),自己实现的容器偶发在lockasync处捕获到异常,错误未知。

2 回复

目前ArkTS开启多线程的方式是,语言基础类库提供的taskPool和worker两个多线程的方案。

这两种方案都是基于Actor并发模型实现的,线程间隔离,内存不共享。Actor并发模型是基于事件基础传递数据,不需要去面对锁代理的一系列复杂偶发的问题,是线程安全的,同时并发度也相对较高。

参考地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/taskpool-vs-worker-V5

使用Sendable类型的对象在发送到其他TS线程后可被多线程读写,需要通过异步锁机制进行管理:

https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-app-concurrency-design-V5#section1464215361757

异步锁api及示例:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-arkts-utils-V5

在 offer 的 return 中添加 await 然后再进行测试,如下:

public async offer(item: T): Promise<boolean> { // 非阻塞添加

try {

return await this.lock_!.lockAsync(() => {

let node = new LinkedBlockingQueueNode<T>(item);

this.last = this.last!.next = node;

this.count_++;

return true;

}, ArkTSUtils.locks.AsyncLockMode.EXCLUSIVE);

} catch (error) {

console.error("testTag", "LinkedBlockingQueue offering operation generate error.", JSON.stringify(error));

return false;

}

}

如果仍然存在问题,让提供具体的信息,

constructor中的

this.head = new LinkedBlockingQueueNode<T>(null);
this.last = this.head;

和offer中的

let node = new LinkedBlockingQueueNode<T>(item);
this.last = this.last!.next = node;

这几行代码是否是必须的逻辑处理,是的话,提供 LinkedBlockingQueueNode 类

更多关于HarmonyOS 鸿蒙Next lockasync偶发捕获到异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对帖子标题“HarmonyOS 鸿蒙Next lockasync偶发捕获到异常”的问题,可以作如下回答:

在HarmonyOS系统中,如果遇到Next lockasync偶发捕获到异常的情况,这通常表明在异步锁机制中存在某些不稳定的因素。lockasync函数通常用于异步地获取锁,如果在执行过程中出现异常,可能的原因包括但不限于:

  1. 资源竞争:多个线程或任务同时尝试获取同一个锁,导致竞争条件,可能引发异常。
  2. 锁状态不一致:锁的内部状态可能由于某种原因(如硬件故障、软件bug)而变得不一致,导致lockasync无法正确执行。
  3. 系统负载:系统高负载时,任务调度可能受到影响,导致lockasync无法及时获取锁或执行异常。

为了解决这个问题,可以尝试以下方向(注意,这里仅提供可能的方向,不直接给出建议或代码):

  • 检查锁的使用场景:确保锁的使用符合设计预期,避免不必要的竞争。
  • 优化系统性能:降低系统负载,提高任务调度的效率。
  • 增强错误处理:在lockasync调用周围增加更健壮的错误处理逻辑。

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

回到顶部