在多线程并发场景中,如何实现安全访问同一块共享内存

在多线程并发场景中,如何实现安全访问同一块共享内存

HarmonyOS
2024-03-17 13:20:04
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
易安安安

可以使用共享对象SharedArrayBuffer实现。SharedArrayBuffer对象存储的数据在同时被修改时,需要通过Atomics原子操作保证其同步性,即下个操作开始之前务必需要等到上个操作已经结束。代码示例:

import { MessageEvents, worker } from '@kit.ArkTS'; 
 
let sab = new SharedArrayBuffer(32); 
// int32 buffer view for sab 
let i32a = new Int32Array(sab); 
i32a[0] = 0; 
 
let producer = new worker.ThreadWorker("entry/ets/workers/worker_producer.ts") 
producer.postMessage(sab); 
let consumection = (e: MessageEvents) => { 
  let sab: number = e.data; 
  let i32a = new Int32Array(sab); 
  console.info("Customer: received sab"); 
  while (true) { 
    Atomics.wait(i32a, 0, 0); // blocked here until be waked. 
    let length = i32a.length; 
    for (let i = length - 1; i > 0; i--) { 
      console.info("arraybuffer " + i + " value is " + i32a[i]); 
      i32a[i] = i; 
    } 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
分享
微博
QQ
微信
回复
2024-03-18 16:26:54
相关问题
如何实现多线程数据共享
3124浏览 • 1回复 待解决
多线程EGL如何共享Context
1437浏览 • 1回复 待解决
Actor线程内存如何共享
1109浏览 • 1回复 待解决
Worker线程内存如何共享
3094浏览 • 1回复 待解决
TaskPool线程内存如何共享
2894浏览 • 1回复 待解决
HarmonyOS 多线程并发相关问题
972浏览 • 1回复 待解决
ArkTs多线程方案如何保证线程安全
3564浏览 • 2回复 待解决
HarmonyOS 关于多线程并发的使用
875浏览 • 1回复 待解决