TaskPool底层模型为Actor模型,本身线程间隔离,内存不共享。目前可以通过传输可共享对象SharedArrayBuffer达到内存共享的目的。但需要注意,SharedArrayBuffer对象存储的数据在同时被修改时,需要通过原子操作保证其同步性,即下个操作开始之前务必需要等到上个操作已经结束。参考代码如下:import { taskpool } from '@kit.ArkTS'; @Concurrent function producer(ArrayBuffer: Int32Array): void { let i32a = ArrayBuffer; 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); } @Concurrent function consumer(ArrayBuffer: Int32Array): void { let i32a = ArrayBuffer; 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; } } } function ArrayBufferShared(ArrayBuffer: Int32Array): void { let group: taskpool.TaskGroup = new taskpool.TaskGroup(); group.addTask(consumer, ArrayBuffer); group.addTask(producer, ArrayBuffer); taskpool.execute(group, taskpool.Priority.HIGH).then((ret: Object) => { // 结果数组汇总处理 }) } @Entry @Component struct Index { build() { Row() { Column() { Text('Click') .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { let sab = new SharedArrayBuffer(32); let i32a = new Int32Array(sab); ArrayBufferShared(i32a); }) } .width('100%') } .height('100%') } }参考链接@ohos.taskpool(启动任务池)多线程并发概述 (TaskPool和Worker)Actor模型可共享对象
TaskPool底层模型为Actor模型,本身线程间隔离,内存不共享。目前可以通过传输可共享对象SharedArrayBuffer达到内存共享的目的。
但需要注意,SharedArrayBuffer对象存储的数据在同时被修改时,需要通过原子操作保证其同步性,即下个操作开始之前务必需要等到上个操作已经结束。
参考代码如下:
参考链接
@ohos.taskpool(启动任务池)
多线程并发概述 (TaskPool和Worker)
Actor模型
可共享对象