Worker线程内存如何共享

Worker线程内存如何共享


HarmonyOS
2024-03-17 14:08:11
1429浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
truemichael

Worker底层模型为Actor模型,本身线程间隔离,内存不共享。目前可以通过传输可共享对象SharedArrayBuffer达到内存共享的目的。

但需要注意,SharedArrayBuffer对象存储的数据在同时被修改时,需要通过原子操作保证其同步性,即下个操作开始之前务必需要等到上个操作已经结束。

参考代码如下:

1.在Index.ets中新建两个ThreadWorker。

import { worker } from '@kit.ArkTS'; 
 
@Entry 
@Component 
struct Index { 
  build() { 
    Column() { 
      Button() 
        .width(200) 
        .onClick(() => { 
          let sab = new SharedArrayBuffer(32); 
          let i32a = new Int32Array(sab); 
          i32a[0] = 0; 
          let producer = new worker.ThreadWorker("entry/ets/workers/worker_producer.ets"); 
          producer.postMessage(sab); 
          let consumer = new worker.ThreadWorker("entry/ets/workers/worker_consumer.ets"); 
          consumer.postMessage(sab); 
        }) 
    } 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

2.在 build-profile.json5的buildOption中添加字段。

"buildOption": { 
    "sourceOption": { 
      "workers": [ 
        "./src/main/ets/workers/worker_producer.ets", 
        "./src/main/ets/workers/worker_consumer.ets" 
      ] 
    } 
},
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

3.编写worker_producer.ets脚本。

import { worker, MessageEvents } from '@kit.ArkTS'; 
 
const workerPort = worker.workerPort; 
workerPort.onmessage = (e: MessageEvents): void => { 
  let i32a = new Int32Array(e.data); 
  console.info("Producer: received sab"); 
  setInterval(() => { 
    let length = i32a.length; 
    for (let i = 1; i < length; i++) { 
      i32a[i] = Math.random() * length; 
    } 
    Atomics.notify(i32a, 0, 1); // notify customer 
  }, 2000); 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

4.编写worker_consumer.ets脚本。

import { worker, MessageEvents } from '@kit.ArkTS'; 
 
const workerPort = worker.workerPort; 
workerPort.onmessage = (e: MessageEvents): void => { 
  let i32a = new Int32Array(e.data); 
  console.info("Customer: received sab"); 
  while (true) { 
    Atomics.wait(i32a, 0, 0); 
    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.

参考链接

@ohos.worker (启动一个Worker)

多线程并发概述 (TaskPool和Worker)

Actor模型

可共享对象

分享
微博
QQ
微信
回复
2024-03-18 16:57:53


相关问题
Actor线程内存如何共享
1116浏览 • 1回复 待解决
TaskPool线程内存如何共享
2903浏览 • 1回复 待解决
Worker线程如何销毁?
884浏览 • 1回复 待解决
HarmonyOS napi共享内存指导
747浏览 • 1回复 待解决
如何实现多线程数据共享
3131浏览 • 1回复 待解决
如何创建一个worker线程
1746浏览 • 1回复 待解决
如何实现跨线程数据共享
1028浏览 • 1回复 待解决
如何Worker中开启多级子线程
1037浏览 • 1回复 待解决
线程中EGL如何共享Context
1446浏览 • 1回复 待解决
Worker的宿主线程必须是主线程吗?
1197浏览 • 1回复 待解决
HarmonyOS 共享包里面可以使用worker
1224浏览 • 1回复 待解决
HarmonyOS 线程共享资源问题
923浏览 • 1回复 待解决