鴻蒙 NEXT 開發(fā)中,普通對象跨線程如何傳遞

大家好鞋真,我是 V 哥崇堰,在鴻蒙HarmonyOS NEXT開發(fā)中,跨線程對象傳遞可以通過拷貝形式實現(xiàn)涩咖,確保兩個線程的對象內(nèi)容一致海诲,但各自指向線程的隔離內(nèi)存區(qū)間。以下是使用SharedArrayBuffer實現(xiàn)跨線程共享內(nèi)存的完整案例代碼檩互,包括詳細解釋特幔,整理的學習筆記,分享給大家闸昨。關注威哥不迷路蚯斯,學習鴻蒙就很酷薄风。

案例代碼

1. 主線程代碼

@Component
export struct LockUsage {
  taskNum: number = 10; // 任務數(shù),實際并行線程數(shù)依設備而定
  baseDir: string = getContext().filesDir + '/TextDir'; // 文件寫入的應用沙箱路徑
  sabInLock: SharedArrayBuffer = new SharedArrayBuffer(4); // 在主線程拍嵌,初始化子線程鎖標志位遭赂,所使用的共享內(nèi)存
  sabForLine: SharedArrayBuffer = new SharedArrayBuffer(4); // 在主線程,初始化子線程偏移位横辆,所使用的共享內(nèi)存
  @State result: string = "";
  build() {
    Row() {
      Column() {
        Button($r('app.string.not_use_lock'))
          .width("80%").fontSize(30)
          .fontWeight(FontWeight.Bold)
          .margin({ top: 30 })
          .onClick(async () => {
            this.startWrite(false);
          })
        Button($r('app.string.use_lock'))
          .width("80%")
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
          .margin({ top: 30 })
          .onClick(async () => {
            this.startWrite(true);
          })
        Text(this.result)
          .width("80%")
          .fontSize(30)
          .fontWeight(FontWeight.Bold)
          .fontColor(Color.Blue)
          .margin({ top: 30 })
      }
      .width('100%')
    }
    .height('100%')
  }
  startWrite(useLock: boolean): void {
    this.result = getContext().resourceManager.getStringSync($r('app.string.write_file_start'));
    let whichLineToWrite: Int32Array = new Int32Array(this.sabForLine);
    Atomics.store(whichLineToWrite, 0, 0);
    let taskPoolGroup: taskpool.TaskGroup = new taskpool.TaskGroup();
    for (let i: number = 0; i < this.taskNum; i++) {
      taskPoolGroup.addTask(new taskpool.Task(createWriteTask, this.baseDir, i, this.sabInLock, this.sabForLine, useLock));
    }
    taskpool.execute(taskPoolGroup).then(() => {
      this.result = getContext().resourceManager.getStringSync($r('app.string.write_file_success'));
    }).catch(() => {
      this.result = getContext().resourceManager.getStringSync($r('app.string.write_file_failed'));
    })
  }
}

2. 子線程代碼

@Concurrent
async function createWriteTask(baseDir: string, writeText: number, sabInLock: SharedArrayBuffer, sabForLine: SharedArrayBuffer, useLock: boolean): Promise<void> {
  class Option { 
    offset: number = 0;
    length: number = 0;
    encoding: string = 'utf-8';
    constructor(offset: number, length: number) {
      this.offset = offset;
      this.length = length;
    }
  }
  let filePath: string | undefined = undefined;
  filePath = baseDir + useLock ? "/useLock.txt" : "/unusedLock.txt";
  if (!fs.accessSync(baseDir)) {
    fs.mkdirSync(baseDir);
  }
  let nrl: NonReentrantLock | undefined = undefined;
  if (useLock) {
    nrl = new NonReentrantLock(sabInLock);
  }
  let whichLineToWrite: Int32Array = new Int32Array(sabForLine);
  let str: string = writeText + '\n';
  for (let i: number = 0; i < 100; i++) {
    if (useLock && nrl !== undefined) {
      nrl.lock();
    }
    let file: fs.File = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    try {
      fs.writeSync(file.fd, str, new Option(whichLineToWrite[0], str.length));
    } catch (err) {
      logger.error(`errorCode : ${err.code},errMessage : ${err.message}`);
    }
    fs.closeSync(file);
    whichLineToWrite[0] += str.length;
    if (useLock && nrl !== undefined) {
      nrl.unlock();
    }
  }
}

詳細解釋

  1. 主線程初始化共享內(nèi)存

    • sabInLocksabForLine 是兩個 SharedArrayBuffer 對象撇他,分別用于子線程鎖標志位和偏移位。它們在主線程中被初始化狈蚤,并將被傳遞給子線程困肩,實現(xiàn)跨線程共享內(nèi)存。
  2. 子線程寫入文件

    • 子線程根據(jù)主線程傳入的 SharedArrayBuffer 初始化鎖和偏移量脆侮。
    • 使用鎖確保線程安全锌畸,避免多個線程同時寫入文件時出現(xiàn)數(shù)據(jù)競爭。
    • 通過 Atomics.storeAtomics.load 操作共享內(nèi)存他嚷,實現(xiàn)線程間的同步蹋绽。
  3. 線程間參數(shù)傳遞

    • 使用 taskpool.Task 創(chuàng)建子線程任務,并通過 taskpool.execute 執(zhí)行筋蓖。
    • 子線程任務通過 createWriteTask 函數(shù)實現(xiàn)卸耘,該函數(shù)接收主線程傳遞的參數(shù),包括文件路徑粘咖、寫入內(nèi)容蚣抗、鎖標志位和偏移位。
  4. 線程安全寫入

    • 在寫入文件前瓮下,如果啟用鎖翰铡,則獲取鎖;寫入完成后釋放鎖讽坏,確保線程安全锭魔。
    • 通過修改共享內(nèi)存中的偏移量,指定下次寫入的位置路呜,實現(xiàn)線程間的協(xié)作迷捧。

這個案例展示了如何在鴻蒙HarmonyOS NEXT開發(fā)中實現(xiàn)跨線程對象傳遞和共享內(nèi)存,確保線程安全和數(shù)據(jù)一致性胀葱。通過使用 SharedArrayBuffer 和線程間參數(shù)傳遞漠秋,可以實現(xiàn)高效的并發(fā)編程。關注威哥愛編程抵屿,一起向鴻蒙出發(fā)庆锦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市轧葛,隨后出現(xiàn)的幾起案子搂抒,更是在濱河造成了極大的恐慌艇搀,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燕耿,死亡現(xiàn)場離奇詭異中符,居然都是意外死亡,警方通過查閱死者的電腦和手機誉帅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來右莱,“玉大人蚜锨,你說我怎么就攤上這事÷眩” “怎么了亚再?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晨抡。 經(jīng)常有香客問我氛悬,道長,這世上最難降的妖魔是什么耘柱? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任如捅,我火速辦了婚禮,結(jié)果婚禮上调煎,老公的妹妹穿的比我還像新娘镜遣。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袒哥,像睡著了一般谈飒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上压状,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音,去河邊找鬼秫筏。 笑死,一個胖子當著我的面吹牛需了,可吹牛的內(nèi)容都是我干的跳昼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肋乍,長吁一口氣:“原來是場噩夢啊……” “哼鹅颊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起墓造,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤堪伍,失蹤者是張志新(化名)和其女友劉穎锚烦,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體帝雇,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡涮俄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了尸闸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彻亲。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吮廉,靈堂內(nèi)的尸體忽然破棺而出苞尝,到底是詐尸還是另有隱情,我是刑警寧澤宦芦,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布宙址,位于F島的核電站,受9級特大地震影響调卑,放射性物質(zhì)發(fā)生泄漏抡砂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一恬涧、第九天 我趴在偏房一處隱蔽的房頂上張望注益。 院中可真熱鬧,春花似錦气破、人聲如沸聊浅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽低匙。三九已至,卻和暖如春碳锈,著一層夾襖步出監(jiān)牢的瞬間顽冶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工售碳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留强重,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓贸人,卻偏偏與公主長得像间景,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子艺智,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容