HarmonyOS 鸿蒙Next Usb服务在Worker多进程下调度问题

发布于 1周前 作者 ionicwang 来自 鸿蒙OS

HarmonyOS 鸿蒙Next Usb服务在Worker多进程下调度问题 在主线程中创建3个Worker线程进行工作,他们直接通过主线程作为桥梁通过发送消息进行通知,我需要3个工作线程使用相同的变量即第一个工作线程中初始化获取的USBEndpoint、USBInterface、USBDevicePipe等变量,当然我的变量随时可能发生变化,所以当我在第一个工作线程中获取一次,另外的工作线程也能正常获取到

我将变量缓存到了主线程的工具类中,我发现每个Worker(工作线程)之间是隔离的,内存不共享。所以每个Worker获取的“单例”在不同的Worker中会是不同的对象,所以我其他工作线程无法正常工作,而且有调度问题。在java中我可以通过单例配合锁机制以及线程睡眠等方法让出调度,多个工作线程之间是可以使用同一套变量的,在arcTypeScript中我实现不了。有相关解决方案吗。


更多关于HarmonyOS 鸿蒙Next Usb服务在Worker多进程下调度问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

多线程下的唯一单例需要使用共享模块开发,指导文档如下:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-sendable-module-V5
其中,单例的数据类型要支持Sendable协议,Sendable开发指导文档如下:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-sendable-V5

import { collections } from '@kit.ArkTS'

@Sendable
export class myUSBEndPoint {
  address: number = 0
  attributes: number = 0
  interval: number = 0
  maxPacketSize: number = 0
  direction: number = 0
  number: number = 0
  type: number = 0
  interfaceId: number = 0
}

@Sendable
export class myUSBInterface {
  id: number = 0
  protocol: number = 0
  clazz: number = 0
  subClass: number = 0
  alternateSetting: number = 0
  name: string = ''
  type: number = 0
  endpoints: collections.Array<myUSBEndPoint> = new collections.Array<myUSBEndPoint>();
}

@Sendable
export class myUSBDevicePipe {
  busNum: number = 0
  devAddress: number = 0
}
import { ArkTSUtils } from '@kit.ArkTS';
import { myUSBDevicePipe, myUSBEndPoint, myUSBInterface } from './UsbInfo';

"use shared"
@Sendable
export class UsbInfoUtil {
  lock_: ArkTSUtils.locks.AsyncLock = new ArkTSUtils.locks.AsyncLock()
  private UsbEndpoint: myUSBEndPoint = new myUSBEndPoint()
  private UsbInterface: myUSBInterface = new myUSBInterface()
  private UsbDevicePipe: myUSBDevicePipe = new myUSBDevicePipe()
  private static instance: UsbInfoUtil;
  private constructor() {}

  public static getInstance(): UsbInfoUtil {
    if (UsbInfoUtil.instance == null) {
      UsbInfoUtil.instance = new UsbInfoUtil();
      console.debug('getInstance  new  ')
    }
    return UsbInfoUtil.instance;
  }

  async getUsbEndpoint(): Promise<myUSBEndPoint> {
    return this.lock_.lockAsync(() => {
      return this.UsbEndpoint;
    })
  }

  async setUsbEndpoint(UsbEndpoint: myUSBEndPoint) {
    await this.lock_.lockAsync(() => {
      this.UsbEndpoint = UsbEndpoint;
    })
  }

  async getUsbInterface(): Promise<myUSBInterface> {
    return this.lock_.lockAsync(() => {
      return this.UsbInterface;
    })
  }

  async setUsbInterface(UsbInterface: myUSBInterface) {
    await this.lock_.lockAsync(() => {
      this.UsbInterface = UsbInterface;
    })
  }

  async getUsbDevicePipe(): Promise<myUSBDevicePipe> {
    return this.lock_.lockAsync(() => {
      return this.UsbDevicePipe;
    })
  }

  async setUsbDevicePipe(UsbDevicePipe: myUSBDevicePipe) {
    await this.lock_.lockAsync(() => {
      this.UsbDevicePipe = UsbDevicePipe;
    })
  }
}

更多关于HarmonyOS 鸿蒙Next Usb服务在Worker多进程下调度问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


关于HarmonyOS(鸿蒙)Next Usb服务在Worker多进程下的调度问题,主要涉及多进程环境下服务的正确执行与资源调度。

在鸿蒙系统中,若Next Usb服务需要在Worker多进程环境下运行,需确保服务在不同进程间的正确调度与通信。鸿蒙系统提供了多种进程间通信(IPC)机制,如消息队列、共享内存等,可用于Worker进程与服务主体进程间的数据交换与控制指令传递。

针对调度问题,可检查以下几点:

  1. 服务注册与绑定:确保Next Usb服务正确注册,并且Worker进程能够成功绑定到该服务。

  2. 进程间通信:验证IPC机制是否工作正常,确保控制指令和数据能够在主进程与Worker进程间正确传递。

  3. 资源同步:在多进程访问共享资源时,需考虑资源同步问题,避免数据竞争与不一致。

  4. 进程调度策略:根据实际需求调整进程调度策略,确保Worker进程能够按需高效执行。

  5. 错误处理:增加错误处理逻辑,对进程间通信失败、服务不可用等情况进行妥善处理。

若以上检查后问题依旧存在,可能是系统级或特定环境下的复杂问题。此时,建议直接联系鸿蒙系统官方客服寻求专业支持。官网客服地址:官网客服

回到顶部