OpenHarmony开发者论坛

标题: 在多线程并发场景中,如何实现安全访问同一块共享内存? [打印本页]

作者: 北向实践与赋能    时间: 2024-1-4 11:12
标题: 在多线程并发场景中,如何实现安全访问同一块共享内存?
[md]在多线程并发场景中,如何实现安全访问同一块共享内存?
[/md]
作者: 北向实践与赋能    时间: 2024-1-4 11:12
标题: 在多线程并发场景中,如何实现安全访问同一块共享内存?
[md]**解决方案一:**

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

**代码示例**

```ts
// 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);
      i32a = i;
    }
  }
}
```

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




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5