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((res: Object) => {
// 结果数组汇总处理
})
}
@Component
export struct TestArrayBufferSharedView {
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%')
}
}