TaskPool线程内存如何共享

TaskPool线程内存如何共享


HarmonyOS
2024-03-17 13:56:19
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
wjmfzsz

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%') 
  } 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.

参考链接

@ohos.taskpool(启动任务池)

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

Actor模型

可共享对象

分享
微博
QQ
微信
回复
2024-03-18 16:49:57
相关问题
Actor线程内存如何共享
1088浏览 • 1回复 待解决
Worker线程内存如何共享
3082浏览 • 1回复 待解决
TaskPool线程和主线程如何通信
3254浏览 • 1回复 待解决
HarmonyOS napi共享内存指导
731浏览 • 1回复 待解决
如何实现多线程数据共享
3094浏览 • 1回复 待解决
如何使用taskpool实现多线程
2006浏览 • 1回复 待解决
如何实现跨线程数据共享
986浏览 • 1回复 待解决
TaskPool如何跟主线程进行通信
1328浏览 • 1回复 待解决
线程中EGL如何共享Context
1399浏览 • 1回复 待解决
HarmonyOS taskpool线程中senddata报错
1192浏览 • 1回复 待解决
HarmonyOS taskpool线程池数量问题
1132浏览 • 0回复 待解决
HarmonyOS taskpool线程并发问题
772浏览 • 1回复 待解决
HarmonyOS taskpool线程数量控制
1435浏览 • 2回复 待解决
HarmonyOS 线程共享资源问题
900浏览 • 1回复 待解决
HarmonyOS 关于taskpool怎么实现线程同步
1126浏览 • 1回复 待解决