首页 > 其他分享 >HarmonyOS中实现 非可重入锁 NonReentrantLock

HarmonyOS中实现 非可重入锁 NonReentrantLock

时间:2024-04-25 22:55:59浏览次数:26  
标签:LOCKED UNLOCKED Atomics NonReentrantLock HarmonyOS flag 线程 非可

背景

在多线程编程中,确保资源的互斥访问是至关重要的。允许并行执行,但需要同步机制来避免数据竞争和竞态条件。

锁的重要性

锁是一种同步机制,用于控制对共享资源的访问。在ArkTs中,传统的锁实现依赖于语言级别的原子操作,但随着共享内存的引入,我们需要一种新的同步机制。

使用SharedArrayBuffer和Atomics

SharedArrayBuffer允许在多个线程间共享内存,而Atomics提供了一组操作,用于在不同线程间进行线程安全的操作。

NonReentrantLock类实现

以下是NonReentrantLock类的实现,它使用SharedArrayBufferAtomics来确保互斥访问。

锁状态常量

const UNLOCKED = 0; // 锁未被任何线程占用
const LOCKED_SINGLE = 1; // 锁被单个线程占用
const LOCKED_MULTI = 2; // 锁被多个线程占用

NonReentrantLock类

export class NonReentrantLock {
  private flag: Int32Array;

  constructor(sab: SharedArrayBuffer) {
    this.flag = new Int32Array(sab);
  }

  public lock(): void {
    let c = UNLOCKED;
    while (Atomics.compareExchange(this.flag, 0, c, LOCKED_SINGLE) !== UNLOCKED) {
      if (c === LOCKED_MULTI || Atomics.compareExchange(this.flag, 0, LOCKED_SINGLE, LOCKED_MULTI) !== UNLOCKED) {
        Atomics.wait(this.flag, 0, LOCKED_MULTI);
      }
    }
  }

  public tryLock(): boolean {
    return Atomics.compareExchange(this.flag, 0, UNLOCKED, LOCKED_SINGLE) === UNLOCKED;
  }

  public unlock(): void {
    let v0 = Atomics.sub(this.flag, 0, 1);
    if (v0 !== LOCKED_SINGLE) {
      Atomics.store(this.flag, 0, UNLOCKED);
      Atomics.notify(this.flag, 0, 1);
    }
  }
}

使用示例

let sab = new SharedArrayBuffer(4);
let lock = new NonReentrantLock(sab);

// 某个线程尝试获取锁
lock.lock();

// 执行临界区代码...

// 释放锁
lock.unlock();

锁的获取与释放

  • lock方法用于获取锁,如果锁已被占用,调用线程将等待。
  • tryLock方法尝试获取锁,如果成功返回true,否则立即返回false
  • unlock方法用于释放锁,如果锁是被单个线程占用的,减少锁状态;如果是多线程占用的,设置为UNLOCKED并唤醒等待的线程。

注意事项

  • 使用SharedArrayBufferAtomics时,必须确保遵守同源策略。
  • 错误地使用这些API可能导致数据不一致和竞态条件。

结论

NonReentrantLock类提供了一种在ArkTs中实现线程安全锁的方法,这对于需要同步共享内存访问的多线程应用程序非常有用。

标签:LOCKED,UNLOCKED,Atomics,NonReentrantLock,HarmonyOS,flag,线程,非可
From: https://www.cnblogs.com/androidsuperman/p/18158840

相关文章

  • HarmonyOS 项目中泛型的使用
    泛型(Generics)概述泛型是一种编程语言特性,它支持类型参数化,使得定义的类、接口和方法可以适用于多种类型,而不仅仅是固定的一种类型。理解泛型泛型允许在定义接口时,让参数的类型更加灵活,从而使得功能更加强大。简而言之,泛型提供了一种方式,让代码能够适应不同的数据类型,而不需要为......
  • HarmonyOS 应用生命周期有哪些? 按返回键会调用哪些生命周期?
    UIAbility生命周期:onCreate:页面初始化,变量定义,资源加载。onWindowStageCreate:设置UI界面加载、设置WindowStage的事件订阅。onForeground:切换至前台,申请系统需要的资源,或者重新申请在onBackground()中释放的资源。onBackground:切换至后台,释放UI界面不可见时无用的资......
  • HarmonyOS 中 Context 相关的内容及其区别
    以下是不同Context类型及其特点的概述:ApplicationContext应用级别Context:ApplicationContext是应用级别的上下文环境。生命周期管理:提供了订阅应用内Ability生命周期变化的能力。系统资源监控:可以订阅系统内存变化和应用内系统环境的变化。适用场景:在UIAbility、Exte......
  • 鸿蒙HarmonyOS实战-ArkUI事件(触屏事件)
    ......
  • 日志服务 HarmonyOS NEXT 日志采集最佳实践
    背景信息随着数字化新时代的全面展开以及5G与物联网(IoT)技术的迅速普及,操作系统正面临前所未有的变革需求。在这个背景下,华为公司自主研发的鸿蒙操作系统(HarmonyOS)应运而生,旨在满足万物互联时代的多元化设备接入、高效协同和安全可靠运行的需求。HarmonyOS不仅着眼于智能手机......
  • 鸿蒙HarmonyOS实战-ArkUI动画(页面转场动画)
    ......
  • HarmonyOS 实战开发-Worker子线程中解压文件
    介绍本示例介绍在Worker子线程使用@ohos.zlib提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作,解压成功后将解压路径返回主线程,获取解压文件列表。效果图预览使用说明点击解压按钮,解压test.zip文件,显示解压结果。实现思路在/src/main/ets/workers目录......
  • HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置
    介绍本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换。效果图预览使用说明:拖拽Grid中子组件,到目标Grid子组件位置,进行两者位置互换。拖拽List中子组件,到目标List子组件位置,进行两者位置互换。实现思路在Grid组件中,通过editMode()打......
  • 鸿蒙HarmonyOS实战-ArkUI动画(放大缩小视图)
    ......
  • HarmonyOS NEXT应用开发实战—组件堆叠
    介绍本示例介绍运用Stack组件以构建多层次堆叠的视觉效果。通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生。当滚动时,实时地调节组件的透明度、高度等属性,从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组件切换。效果图预览使用说明加载完成......