鸿蒙5.0开发【Worker线程内存如何共享】应用运维

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

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

参考代码如下:

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

import { worker } from '@kit.ArkTS'; 
 
@Component 
export struct ThreadWorkerView { 
  build() { 
    Column() { 
      Button('测试Worker线程内存共享') 
        .width(200) 
        .onClick(() => { 
          let sab = new SharedArrayBuffer(32); 
          let i32a = new Int32Array(sab); 
          i32a[0] = 0; 
          let producer = new worker.ThreadWorker("entry/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerProducer.ets"); 
          producer.postMessage(sab); 
          let consumer = new worker.ThreadWorker("entry/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerConsumer.ets"); 
          consumer.postMessage(sab); 
        }) 
    } 
  } 
}

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

  "buildOption": { 
    "sourceOption": { 
      "workers": [ 
        "./src/main/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerProducer.ets", 
        "./src/main/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerConsumer.ets" 
      ] 
    } 
  },

3.编写worker_producer.ets脚本。

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

4.编写worker_consumer.ets脚本。

import { MessageEvents, worker } from '@kit.ArkTS'; 
 
const workerPort = worker.workerPort; 
workerPort.onmessage = (e: MessageEvents): void => { 
  let i32a = new Int32Array(e.data); 
  console.info("Worker 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; 
    } 
  } 
}console.info("arraybuffer " + i + " value is " + i32a[i]);       i32a[i] = i;     }   } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值