鸿蒙 NEXT 开发中,普通对象跨线程如何传递

news/2025/1/13 10:14:59/文章来源:https://www.cnblogs.com/wgjava/p/18668050

大家好,我是 V 哥,在鸿蒙HarmonyOS NEXT开发中,跨线程对象传递可以通过拷贝形式实现,确保两个线程的对象内容一致,但各自指向线程的隔离内存区间。以下是使用SharedArrayBuffer实现跨线程共享内存的完整案例代码,包括详细解释,整理的学习笔记,分享给大家。关注威哥不迷路,学习鸿蒙就很酷。

案例代码

1. 主线程代码

@Component
export struct LockUsage {taskNum: number = 10; // 任务数,实际并行线程数依设备而定baseDir: string = getContext().filesDir + '/TextDir'; // 文件写入的应用沙箱路径sabInLock: SharedArrayBuffer = new SharedArrayBuffer(4); // 在主线程,初始化子线程锁标志位,所使用的共享内存sabForLine: SharedArrayBuffer = new SharedArrayBuffer(4); // 在主线程,初始化子线程偏移位,所使用的共享内存@State result: string = "";build() {Row() {Column() {Button($r('app.string.not_use_lock')).width("80%").fontSize(30).fontWeight(FontWeight.Bold).margin({ top: 30 }).onClick(async () => {this.startWrite(false);})Button($r('app.string.use_lock')).width("80%").fontSize(30).fontWeight(FontWeight.Bold).margin({ top: 30 }).onClick(async () => {this.startWrite(true);})Text(this.result).width("80%").fontSize(30).fontWeight(FontWeight.Bold).fontColor(Color.Blue).margin({ top: 30 })}.width('100%')}.height('100%')}startWrite(useLock: boolean): void {this.result = getContext().resourceManager.getStringSync($r('app.string.write_file_start'));let whichLineToWrite: Int32Array = new Int32Array(this.sabForLine);Atomics.store(whichLineToWrite, 0, 0);let taskPoolGroup: taskpool.TaskGroup = new taskpool.TaskGroup();for (let i: number = 0; i < this.taskNum; i++) {taskPoolGroup.addTask(new taskpool.Task(createWriteTask, this.baseDir, i, this.sabInLock, this.sabForLine, useLock));}taskpool.execute(taskPoolGroup).then(() => {this.result = getContext().resourceManager.getStringSync($r('app.string.write_file_success'));}).catch(() => {this.result = getContext().resourceManager.getStringSync($r('app.string.write_file_failed'));})}
}

2. 子线程代码

@Concurrent
async function createWriteTask(baseDir: string, writeText: number, sabInLock: SharedArrayBuffer, sabForLine: SharedArrayBuffer, useLock: boolean): Promise<void> {class Option { offset: number = 0;length: number = 0;encoding: string = 'utf-8';constructor(offset: number, length: number) {this.offset = offset;this.length = length;}}let filePath: string | undefined = undefined;filePath = baseDir + useLock ? "/useLock.txt" : "/unusedLock.txt";if (!fs.accessSync(baseDir)) {fs.mkdirSync(baseDir);}let nrl: NonReentrantLock | undefined = undefined;if (useLock) {nrl = new NonReentrantLock(sabInLock);}let whichLineToWrite: Int32Array = new Int32Array(sabForLine);let str: string = writeText + '\n';for (let i: number = 0; i < 100; i++) {if (useLock && nrl !== undefined) {nrl.lock();}let file: fs.File = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);try {fs.writeSync(file.fd, str, new Option(whichLineToWrite[0], str.length));} catch (err) {logger.error(`errorCode : ${err.code},errMessage : ${err.message}`);}fs.closeSync(file);whichLineToWrite[0] += str.length;if (useLock && nrl !== undefined) {nrl.unlock();}}
}

详细解释

  1. 主线程初始化共享内存

    • sabInLocksabForLine 是两个 SharedArrayBuffer 对象,分别用于子线程锁标志位和偏移位。它们在主线程中被初始化,并将被传递给子线程,实现跨线程共享内存。
  2. 子线程写入文件

    • 子线程根据主线程传入的 SharedArrayBuffer 初始化锁和偏移量。
    • 使用锁确保线程安全,避免多个线程同时写入文件时出现数据竞争。
    • 通过 Atomics.storeAtomics.load 操作共享内存,实现线程间的同步。
  3. 线程间参数传递

    • 使用 taskpool.Task 创建子线程任务,并通过 taskpool.execute 执行。
    • 子线程任务通过 createWriteTask 函数实现,该函数接收主线程传递的参数,包括文件路径、写入内容、锁标志位和偏移位。
  4. 线程安全写入

    • 在写入文件前,如果启用锁,则获取锁;写入完成后释放锁,确保线程安全。
    • 通过修改共享内存中的偏移量,指定下次写入的位置,实现线程间的协作。

这个案例展示了如何在鸿蒙HarmonyOS NEXT开发中实现跨线程对象传递和共享内存,确保线程安全和数据一致性。通过使用 SharedArrayBuffer 和线程间参数传递,可以实现高效的并发编程。关注威哥爱编程,一起向鸿蒙出发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868613.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ABC388

好像已经很久没有写过题解了 C link对于每一个糕点,二分查找大于等于它大小的二倍的糕点的位置(可以用\(lower_{}bound\)函数),从这个位置到\(n\)就是可以和这个糕点配对的糕点。猜猜我是啥 #include<bits/stdc++.h>#define int long longusing namespace std;int n;…

零知识证明二(椭圆曲线配对)

本文章将V神关于椭圆曲线配对的文章进行了翻译。原文在此: https://medium.com/@VitalikButerin/exploring-elliptic-curve-pairings-c73c1864e627 1 简介 椭圆曲线配对是各种构造背后的关键密码原型之一,包括确定性阈值签名、zk-SNARKs和其他更简单形式的零知识证明。椭圆曲…

数字化工具助力外贸客户粘性提升

在全球化市场竞争日益激烈的背景下,外贸企业要想在红海中脱颖而出,必须深耕客户体验,提供精细化服务,增强客户粘性。只有以客户为中心,创新服务模式,才能在长期合作中实现双赢。 第一部分:客户粘性的价值与挑战 1. 客户粘性的核心价值 客户粘性是企业持续盈利和长期发展…

测试项目管理系统 - TPA

面对当今汽车行业高速迭代的研发节奏,测试业务的复杂性和高标准使得传统的手动管理方式面临巨大挑战。汽车测试涵盖多种类型,经纬恒润基于多年测试管理经验,推出了测试项目管理系统INTEWORK-TPA产品,TPA是INTEWORK系列产品中用于汽车电子系统测试项目管理的一整套软件解决方…

k8s volcano + deepspeed多机训练 + RDMA ROCE+ 用户权限安全方案

前提:nvidia、cuda、nvidia-fabricmanager等相关的组件已经在宿主机正确安装,如果没有安装可以参考我之前发的文章GPU A800 A100系列NVIDIA环境和PyTorch2.0基础环境配置【建议收藏】_a800多卡运行环境配置-CSDN博客文章浏览阅读1.1k次,点赞8次,收藏16次。Ant系列GPU支持 N…

飞驰云联荣获中国信通院2024年度首期“磐安”优秀案例

2024年12月24日,中国信息通信研究院(以下简称“信通院”)在京成功举办“2025中国信息通信院ICT深度观察报告会”,会上隆重发布了由信通院数字安全护航计划组织的2024年度首期“磐安”优秀案例评选结果,Ftrans飞驰云联凭借卓越的技术创新和案例应用价值,成功入选金融领域优…

Mysql身份认证过程

背景 最近有一些hersql的用户希望能支持mysql的caching_sha2_password认证方式,caching_sha2_password与常用的mysql_native_password认证过程差异还是比较大的,因此抽空研究了一下caching_sha2_password身份认证过程,并为hersql支持了caching_sha2_password的能力hersql是我…

Cloudflare Pages 搭建 DockerHub 镜像加速器

登录https://dash.cloudflare.com/ 进入Workers创建一个Worker名称随意,然后点击部署编辑代码访问https://github.com/cmliu/CF-Workers-docker.io/blob/main/_worker.js 复制代码将代码全部替换点部署刷新预览后显示搜索框部署成功 点返回,然后选择设置,点添加自定义域名填…

开箱即用!一款支持多个大语言模型服务的桌面客户端!

Cherry Studio —— 一款支持多个大语言模型(LLM)服务的桌面客户端,兼容 Windows、Mac 和 Linux 系统。大家好,我是 Java陈序员。 可以说现在 AI 给我们的生活、工作带来了极大的便利,各种大语言模型层出不穷,功能多样。 今天,给大家介绍一款支持多模型服务的桌面客户端…

N皇后问题

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上,并且使皇后彼此之间不能相互攻击(每一行,每一列,每个对角线上只能有一个皇后存在)。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。 示例 1:输入:n = 4 输出:2 解释:如上图所示,4 皇后问题…

掌握设计模式--代理模式

代理模式(Proxy Pattern) 代理模式(Proxy Pattern)是一种结构型设计模式,允许你通过代理对象来控制对其他对象的访问。代理模式的主要目的是通过代理对象来控制原对象的访问、延迟加载、权限控制等。 组成结构Subject(主题接口):定义了真实对象和代理对象的共同接口。 …

前端实现 HTML 网页转 PDF 并导出

有个新需求,当点击【下载】按钮时,直接将当前 html页面下载为 PDF。通过 html2canvas + jsPDF 可实现PDF单页下载,甚至是多页下载,记录分享一下~ 最后有样式源码,可自取🫡有个新需求,当点击【下载】按钮时,直接将当前 html页面下载为 PDF。通过 html2canvas + jsPDF 可…