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

北向实践与赋能 显示全部楼层 发表于 2024-1-4 11:12:26

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

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

精彩评论1

北向实践与赋能

沙发 发表于 2024-1-4 11:12:47

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

解决方案一:

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

代码示例

// index.ets
var sab = new SharedArrayBuffer(32);
// int32 buffer view for sab
var 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) {
  var sab = e.data;
  var i32a = new Int32Array(sab);
  console.info("Customer: received sab");
  while(true) {
    Atomics.wait(i32a,0,0);   //blocked here until be waked.
    var length = i32a.length;
    for (var i = length-1; i > 0; i--) {
      console.info("arraybuffer " + i + " value is " + i32a[i]);
      i32a[i] = i;
    }
  }
}

解决方案二: 2024年Q1,会支持异步锁,可以用于保证Sendable类实例对象的共享内存线程安全性。

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部