【HarmonyOS Next】【性能优化】合理使用多线程共享内存

HarmonyOS Next应用开发案例(持续更新中……)
HarmonyOS Next性能指导总览

本篇文章链接,请访问:https://gitee.com/harmonyos-cases/cases/blob/master/docs/performance/thread_memory_shared.md

概述

在应用开发中,为了避免主线程阻塞,提高应用性能,需要将一些耗时操作放在子线程中执行。此时,子线程就需要访问主线程中的数据。ArkTS采用了基于消息通信的Actor并发模型,具有内存隔离的特性,所以跨线程传输数据时需要将数据序列化,但是AkrTS支持通过可共享对象SharedArrayBuffer实现直接的共享内存。

在开发应用时,如果遇到数据量较大,并且需要多个线程同时操作的情况,推荐使用SharedArrayBuffer共享内存,可以减少数据在线程间传递时需要复制和序列化的额外开销。比如,音视频解码播放、多个线程同时读取写入文件等场景。由于内存是共享的,所以在多个线程同时操作同一块内存时,可能会引起数据的紊乱,这时就需要使用锁来确保数据操作的有序性。本文将基于此具体展开说明。关于多线程的使用和原理,可参考OpenHarmony多线程能力场景化示例实践,本文将不再详细讲述。

工作原理

可共享对象SharedArrayBuffer,是拥有固定长度的原始二进制数据缓冲区,可以存储任何类型的数据,包括数字、字符串等。它支持在多线程之间传递,传递之后的SharedArrayBuffer对象和原始的SharedArrayBuffer对象可以指向同一块内存,进而达到共享内存的目的。SharedArrayBuffer对象存储的数据在子线程中被修改时,需要通过原子操作保证其同步性,即下个操作开始之前务必需要保证上个操作已经结束。下面将通过示例说明原子操作保证同步性的必要性。

非原子操作

......
// 非原子操作,进行10000次++
@Concurrent
function normalProcess(int32Array: Int32Array) {
  for (let i = 0; i < 10000; i++) {
    int32Array[0]++;
  }
}
// 原子操作,进行10000次++
@Concurrent
function atomicsProcess(int32Array: Int32Array) {
  for (let i = 0; i < 10000; i++) {
    Atomics.add(int32Array, 0, 1);
  }
}
......
@State result: string = "计算结果:";
private taskNum: number = 2;
private scroller: Scroller = new Scroller();
......
Button("非原子操作")
  .width("80%")
  .fontSize(30)
  .fontWeight(FontWeight.Bold)
  .margin({ top: 30 })
  .onClick(async () => {
     this.sharedArrayBufferUsage(false);
  })
Scroll(this.scroller) {
  Column() {
    Text(this.result)
      .width("80%")
      .fontSize(30)
      .fontWeight(FontWeight.Bold)
      .fontColor(Color.Blue)
  }
}.height("60%")
.margin({ top: 30 })
......
// 根据传入的值isAtomics判断是否使用原子操作
sharedArrayBufferUsage(isAtomics: boolean) {
  // 创建长度为4的SharedArrayBuffer对象
  let sab: SharedArrayBuffer = 
<think>好的,用户想查找HarmonyOS中公共事件服务的相关接口文档或使用方法。我需要先回顾一下系统提供的引用内容,看看有哪些相关的信息。 引用[1]提到HarmonyOS通过CES(公共事件服务)提供订阅、发布、退订公共事件的能力。这可能涉及到相关的API接口,比如订阅、发布、退订的方法。用户需要具体的接口文档和使用教程,所以需要进一步展开这些内容。 引用[3]和[4]提到了Node-API接口和异步任务开发,虽然用户的问题主要关于公共事件服务,但可能需要考虑异步处理的情况,比如在订阅或发布事件时是否需要使用异步工作对象来避免阻塞主线程。不过这可能属于更高级的应用,基础的使用方法可能不需要这些。 引用[5]提到数据共享和线程安全,但公共事件服务更多是关于事件通信,可能和线程安全关系不大,暂时可以忽略。 接下来,我需要整理公共事件服务的主要接口和使用步骤。根据引用[1],CES的主要功能是订阅、发布、退订。那么对应的API可能包括subscribe、publish、unsubscribe等方法。可能需要给出这些接口的基本用法,并说明参数和注意事项。 另外,用户需要接口文档和使用教程,引用[2]和[3]提供了学习手册的链接,应该推荐用户参考这些资源。特别是引用[3]中的开发学习手册可能包含详细的API说明和示例代码。 可能还需要提到权限问题,因为公共事件可能涉及系统权限,比如发送静态公共事件需要权限。此外,静态事件和动态事件的区别也是需要注意的点,引用[1]中提到公共事件分为静态和动态,静态事件在系统预定义,动态由应用自定义。 在示例代码部分,应该给出订阅和发布的基本代码结构,使用ArkTS语言,因为HarmonyOS主要使用ArkTS。例如,如何创建订阅者,实现回调函数,调用subscribe方法,以及发布事件的示例。 最后,相关问题部分可以引导用户深入了解更多细节,比如权限配置、动态事件定义、异步处理等,这样能帮助用户进一步探索。</think>### HarmonyOS 公共事件服务(CES)接口文档与使用教程 HarmonyOS的公共事件服务(Common Event Service, CES)支持应用间通信,允许应用订阅、发布和退订系统或自定义事件[^1]。以下是核心接口和使用方法: --- #### **一、核心接口说明** 1. **订阅公共事件** ```typescript // 创建订阅者对象 let subscriber: commonEventManager.Subscriber = { onReceiveEvent: (data: string) => { console.log("收到事件数据:" + data); } }; // 订阅事件(以静态事件为例) commonEventManager.subscribe("usual.event.SCREEN_ON", subscriber) .then(() => console.log("订阅成功")) .catch(err => console.error("订阅失败:" + err)); ``` - **参数**: - `eventName`: 事件名称(如`usual.event.SCREEN_ON`为屏幕亮屏事件) - `subscriber`: 订阅者对象,需实现`onReceiveEvent`回调。 2. **发布公共事件** ```typescript // 发布动态事件(需声明权限) let eventParams = { parameters: { key: "value" } // 自定义参数 }; commonEventManager.publish("com.example.MY_EVENT", eventParams) .then(() => console.log("事件发布成功")) .catch(err => console.error("发布失败:" + err)); ``` - **权限要求**: - 发布静态事件需在`config.json`中声明权限。 3. **退订公共事件** ```typescript commonEventManager.unsubscribe(subscriber) .then(() => console.log("退订成功")) .catch(err => console.error("退订失败:" + err)); ``` --- #### **二、使用步骤** 1. **配置权限** 在`config.json`中添加所需权限声明(如发布静态事件需`ohos.permission.COMMON_EVENT_STICKY`)。 2. **定义事件类型** - **静态事件**:使用系统预定义事件(如`usual.event.BOOT_COMPLETED`)。 - **动态事件**:自定义事件名(如`com.example.MY_EVENT`)。 3. **实现订阅与发布逻辑** - 订阅方通过`subscribe()`监听事件。 - 发布方通过`publish()`触发事件并传递参数[^1]。 --- #### **三、文档与学习资源** 1. **官方接口文档** - 参考[HarmonyOS开发者文档](https://developer.harmonyos.com/cn/docs/documentation)中的`公共事件服务`章节。 2. **实战教程** - [OpenHarmony设备开发学习手册](https://gitcode.com/HarmonyOS_MN)包含CES的详细案例[^2]。 - [HarmonyOS Next开发手册](https://gitcode.com/HarmonyOS_MN)提供Node-API与异步任务集成方法(如避免阻塞主线程)[^4]。 --- #### **四、注意事项** 1. **权限管理**:静态事件需严格声明权限,否则发布失败。 2. **性能优化**:高频事件建议使用`napi_create_async_work`异步处理,避免主线程阻塞[^4]。 3. **线程安全**:跨线程数据共享需通过线程安全函数实现[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值