CN111552574A - 一种多线程同步方法及电子设备 - Google Patents

一种多线程同步方法及电子设备 Download PDF

Info

Publication number
CN111552574A
CN111552574A CN202010245880.4A CN202010245880A CN111552574A CN 111552574 A CN111552574 A CN 111552574A CN 202010245880 A CN202010245880 A CN 202010245880A CN 111552574 A CN111552574 A CN 111552574A
Authority
CN
China
Prior art keywords
thread
lock
holding
target
field
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Withdrawn
Application number
CN202010245880.4A
Other languages
English (en)
Inventor
杨启彬
黄施昱
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Publication of CN111552574A publication Critical patent/CN111552574A/zh
Priority to US17/763,490 priority Critical patent/US20220350602A1/en
Priority to PCT/CN2020/116437 priority patent/WO2021057643A1/zh
Priority to EP20869498.4A priority patent/EP4020210A4/en
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/3009Thread control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory
    • G06F9/38585Result writeback, i.e. updating the architectural state or memory with result invalidation, e.g. nullification
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/524Deadlock detection or avoidance
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/526Mutual exclusion algorithms
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2209/00Indexing scheme relating to G06F9/00
    • G06F2209/50Indexing scheme relating to G06F9/50
    • G06F2209/5018Thread allocation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mobile Radio Communication Systems (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

一种多线程同步方法及电子设备,涉及终端技术领域。该方法包括:第一线程请求获取目标锁。具体的,第一线程请求获取目标锁包括以下步骤:第一线程获取目标锁的锁状态变量,该锁状态变量包括持锁线程标识域和阻塞线程数域,然后,第一线程检查持锁线程标识域,若检查持锁线程标识域为有效线程且不为第一线程,第一线程检查阻塞线程数域,若检查阻塞线程数域小于第一阈值,第一线程进行自旋等待;当自旋等待的次数达到第二阈值时,若检查持锁线程标识域为有效线程且不为第一线程,第一线程对阻塞线程数域执行加1操作,并挂起进入阻塞状态。这种技术方案从而有助于降低持锁线程访问共享资源的时长,从而减小电子设备卡顿的概率。

Description

一种多线程同步方法及电子设备
本申请要求在2019年09月25日提交中国专利局、申请号为201910912971.6、申请名称为“一种多线程访问方法及电子设备”的中国专利申请的优先权,其全部内容通过引用结合在本申请中。
技术领域
本申请涉及终端技术领域,特别涉及一种多线程同步方法及电子设备。
背景技术
安卓(android)操作系统通常应用在手机、平板电脑等电子设备中,用于为用户使用电子设备提供统一的接口和友好的交互界面,可以支持多线程运行。目前,在安卓操作系统中,共享资源(例如共享内存、共享代码、共享数据等)可以被多线程访问,为了避免多线程同时访问共享资源,通过锁实现对共享资源的保护。以锁1保护共享资源1为例。多线程中只有持锁1的线程能够实现对共享资源1的访问,而一旦有线程获取到锁1,则其它线程无法再对锁1持锁,即锁1在同一时刻只能被一个线程持有。只有当持锁1的线程释放锁1后,其它线程才获得对锁1的持锁机会。
然而,现有技术中,线程通常是采用锁膨胀策略来竞争持锁的。虽然这种方式针对一个锁来说实现了在同一时刻只能被一个线程持有,但是容易导致持锁线程访问共享资源的时长增加,电子设备卡顿的概率增大,降低用户体验。
发明内容
本申请实施例提供了一种多线程同步方法及电子设备,有助于降低持锁线程访问共享资源的时长,从而减小电子设备卡顿的概率,提高用户体验。
第一方面,为本申请实施例的一种多线程同步方法,具体包括:第一线程请求获取目标锁。
其中,第一线程请求获取目标锁,包括:
步骤一、第一线程获取目标锁的锁状态变量,该锁状态变量包括持锁线程标识域和阻塞线程数域,持锁线程标识域用于指示目标锁的持锁线程,阻塞线程数域用于指示针对目标锁处于阻塞状态的线程数;
步骤二、第一线程检查持锁线程标识域;
步骤三、第一线程若检查持锁线程标识域为有效线程且不为第一线程,第一线程检查阻塞线程数域;
步骤四、第一线程若检查阻塞线程数域小于第一阈值,第一线程进行自旋等待;
步骤五、第一线程当自旋等待的次数达到第二阈值时,若检查持锁线程标识域为有效线程且不为第一线程,第一线程对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
本申请实施例中,由于目标锁的锁状态变量包括持锁线程标识域和阻塞线程数域,而阻塞线程数域用于指示针对目标锁处于阻塞状态的线程数,持锁线程不会对阻塞线程域进行修改,从而使得第一线程当自旋等待的次数达到第二阈值时,若检查持锁线程标识域为除第一线程以外的其它有效线程,第一线程无需将持锁线程挂起,也无需分配montior对象,就能够对阻塞线程数域执行加1操作,因而有助于降低持锁线程访问共享资源的时长,从而减小电子设备卡顿的概率,提高用户体验。
在一种可能的设计中,在步骤三之后还包括:
步骤六、第一线程若检查阻塞线程数域大于或等于第一阈值,第一线程对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
在一种可能的设计中,锁状态变量还包括重复持锁次数域,重复持锁次数域用于指示持锁线程针对目标锁的持锁次数。从而使得锁状态变量能够记录持锁线程针对目标锁的持锁次数,有助于降低持锁线程释放锁时发生异常的可能性。
在一种可能的设计中,在步骤二之后还包括:
步骤七、第一线程若检查持锁线程标识域为第一线程,第一线程对重复持锁次数域执行加1操作。由于重复持锁次数域用于指示持锁线程针对目标锁的持锁次数,而第一线程对重复持锁次数域执行加1操作,无需分配monitor对象,因此有助于提高第一线程运行的效率,进一步减小电子设备卡顿的概率,从而提高用户提验。
在一种可能的设计中,在步骤二之后还包括:
步骤八、第一线程若检查持锁线程标识域为无效线程,第一线程将持锁线程标识域设置为第一线程,以及将重复持锁次数域设置为初始值。
在一种可能的设计中,所述方法还包括:第一线程请求释放目标锁。
其中,第一线程请求释放目标锁,包括:
步骤九、第一线程获取目标锁的锁状态变量:
步骤十、第一线程检持锁线程标识域;
步骤十一、第一线程若检查持锁线程标识域为第一线程,第一线程检查重复持锁次数域;
步骤十二、第一线程若检查重复持锁次数域不为0,第一线程对重复持锁次数域执行减1操作。
通过上述技术方案,有助于简化第一线程请求释放目标锁的过程。
在一种可能的设计中,在步骤十二之后还包括:
步骤十三、第一线程若检查重复持锁次数域为0,第一线程将持锁线程标识域设置为无效线程;
步骤十四、第一线程检查阻塞线程数域;
步骤十五、第一线程若检查阻塞线程数域不为0,第一线程唤醒针对目标锁处于阻塞状态的至少一个线程。
由于第一线程在释放对目标锁的控制权后,还可以唤醒针对目标锁处于阻塞状态的至少一个线程,从而提高线程对目标锁持锁的可能性,提高线程运行的效率。
在一种可能的设计中,所述方法还包括:第一线程请求中止对目标锁持锁。
其中,第一线程请求中止对目标锁持锁,包括:
步骤十六、第一线程获取所述目标锁的锁状态变量;
步骤十七、第一线程检查持锁线程标识域;
步骤十八、第一线程若检查持锁线程标识域为第一线程,第一线程将重复持锁次数域保存为第一线程针对目标锁的上下文;
步骤十九、第一线程将第一线程的线程标识ID添加到与目标锁的ID对应的线程等待列表中;
步骤二十、第一线程将重复持锁次数域置0,以及将持锁线程标识域设置为无效线程,并挂起进入阻塞状态。
本申请实施例中,由于第一线程可以将第一线程的线程ID添加到与目标锁的ID
对应的线程等待列表中,从而便于第一线程便于被其它线程或系统唤醒。
在一种可能的设计中,在步骤二十之后还包括:
步骤二十一、第一线程当被唤醒后,获取目标锁的锁状态变量;
步骤二十二、第一线程检查持锁线程标识域;
步骤二十三、第一线程若检查持锁线程标识域为无效线程,第一线程将持锁线程标识域设置为第一线程,并根据第一线程针对目标锁的上下文,设置重复持锁次数域;
步骤二十四、第一线程删除与目标锁的ID对应的线程等待列表中的第一线程的线程ID。
通过上述技术方案,使得在第一线程请求中止对目标锁持锁的情况下,若重新被唤醒,则可以实现重新恢复对目标锁持锁。
在一种可能的设计中,第一线程可以通过以下方式被唤醒,获取所述目标锁的锁状态变量:
第一线程当被第二线程唤醒后,获取目标锁的锁状态变量,其中,第二线程是当与目标锁的ID对应的线程等待列表中存储有第一线程的线程ID时,唤醒第二线程的;第二线程与第一线程属于同一进程;或者,
第一线程当挂起的时长超过第三阈值时被系统唤醒,获取所述目标锁的锁状态变量。
从而有助于简化在第一线程请求中止对目标锁持锁的情况下,第一线程被唤醒的方式。
在一种可能的设计中,阻塞线程数域包括第一值和阻塞线程数高位标识,第一值为针对目标锁处于阻塞状态的线程数的低位上的值,阻塞线程数高位标识用于指示阻塞线程数高位列表中是否存储有与目标锁的ID对应的第二值,第二值为针对目标锁处于阻塞状态的线程数的高位上的值。从而有助于避免针对目标锁处于阻塞状态的线程数较多时导致溢出。
在一种可能的设计中,重复持锁次数域包括第三值和重复持锁次数高位标识,第三值为持锁线程针对目标锁的持锁次数的低位上的值,重复持锁次数高位标识用于指示重复持锁次数高位列表中是否存储有与目标锁的ID和持锁线程的线程ID对应的第四值,第四值为持锁线程针对目标锁的持锁次数的高位上的值。从而有助于避免持锁线程针对目标锁的持锁次数较多时导致溢出。
在一种可能的设计中,第一线程可以基于下述方式挂起进入阻塞状态:
第一线程进行系统调用,将第一线程的状态设置为睡眠态,并将第一线程添加到与目标锁的地址对应的等待队列中。从而有助于简化实现方式。
第二方面,为本申请实施例的一种电子设备,具体包括处理器和存储器,该存储器中存储有程序指令;处理器调用存储器中存储的程序指令,用于第一线程请求获取目标锁;
其中,第一线程请求获取目标锁,包括:
步骤一、第一线程获取目标锁的锁状态变量,该锁状态变量包括持锁线程标识域和阻塞线程数域,持锁线程标识域用于指示目标锁的持锁线程,阻塞线程数域用于指示针对目标锁处于阻塞状态的线程数;
步骤二、第一线程检查持锁线程标识域:
步骤三、第一线程若检查持锁线程标识域为有效线程且不为第一线程,第一线程检查阻塞线程数域;
步骤四、第一线程若检查阻塞线程数域小于第一阈值,第一线程进行自旋等待;
步骤五、第一线程当自旋等待的次数达到第二阈值时,若检查持锁线程标识域为有效线程且不为第一线程,第一线程对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
在一种可能的设计中,在步骤三之后还包括:
步骤六、第一线程若检查阻塞线程数域大于或等于第一阈值,第一线程对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
在一种可能的设计中,目标锁的锁状态变量还包括重复持锁次数域,重复持锁次数域用于指示持锁线程针对目标锁的持锁次数。
在一种可能的设计中,在步骤二之后还包括:
步骤七、第一线程若检查持锁线程标识域为第一线程,第一线程对重复持锁次数域执行加1操作。
在一种可能的设计中,在步骤二之后还包括:
步骤八、第一线程若检查持锁线程标识域为无效线程,第一线程将持锁线程标识域设置为第一线程,以及将重复持锁次数域设置为初始值。
在一种可能的设计中,处理器调用程序指令,还用于第一线程请求释放目标锁:
其中,第一线程请求释放目标锁,包括:
步骤九、第一线程获取目标锁的锁状态变量:
步骤十、第一线程检查持锁线程标识域;
步骤十一、第一线程若检查持锁线程标识域为第一线程,第一线程检查重复持锁次数域;
步骤十二、第一线程若检查重复持锁次数域不为0,第一线程对重复持锁次数域执行减1操作。
在一种可能的设计中,在步骤十二之后还包括:
步骤十三、第一线程若检查重复持锁次数域为0,第一线程将持锁线程标识域设置为无效线程;
步骤十四、第一线程检查阻塞线程数域;
步骤十五、第一线程若检查阻塞线程数域不为0,第一线程唤醒针对目标锁处于阻塞状态的至少一个线程。
在一种可能的设计中,处理器调用程序指令,还用于第一线程请求中止对目标锁持锁:
其中,第一线程请求中止对目标锁持锁,包括:
步骤十六、第一线程获取目标锁的锁状态变量;
步骤十七、第一线程检查持锁线程标识域;
步骤十八、第一线程若检查持锁线程标识域为第一线程,将重复持锁次数域保存为第一线程针对目标锁的上下文;
步骤十九、第一线程将第一线程的线程标识ID添加到与目标锁的ID对应的线程等待列表中;
步骤二十、第一线程将重复持锁次数域置0,以及将持锁线程标识域设置为无效线程,并挂起进入阻塞状态。
在一种可能的设计中,在步骤二十之后还包括:
步骤二十一、第一线程当被唤醒后,获取目标锁的锁状态变量;
步骤二十二、第一线程检查持锁线程标识域;
步骤二十三、第一线程若检查持锁线程标识域为无效线程,第一线程将持锁线程标识域设置为第一线程,并根据第一线程针对目标锁的上下文,设置重复持锁次数域;
步骤二十四、第一线程删除与目标锁的ID对应的线程等待列表中的第一线程的线程ID。
在一种可能的设计中,第一线程可以基于下列方式被唤醒,然后获取目标锁的锁状态变量:
第一线程当被第二线程唤醒后,获取目标锁的锁状态变量,其中,第二线程是当与目标锁的ID对应的线程等待列表中存储有第一线程的线程ID时,唤醒第二线程的;第二线程与第一线程属于同一进程;或者,
第一线程当挂起的时长超过第三阈值时被系统唤醒,获取目标锁的锁状态变量。
在一种可能的设计中,阻塞线程数域包括第一值和阻塞线程数高位标识,第一值为针对目标锁处于阻塞状态的线程数的低位上的值,阻塞线程数高位标识用于指示阻塞线程数高位列表中是否存储有与目标锁的ID对应的第二值,第二值为针对目标锁处于阻塞状态的线程数的高位上的值。
在一种可能的设计中,重复持锁次数域包括第三值和重复持锁次数高位标识,第三值为持锁线程针对目标锁的持锁次数的低位上的值,重复持锁次数高位标识用于指示重复持锁次数高位列表中是否存储有与目标锁的ID和持锁线程的线程ID对应的第四值,第四值为持锁线程针对目标锁的持锁次数的高位上的值。
在一种可能的设计中,第一线程可以基于下列方式挂起进入阻塞状态:
第一线程进行系统调用,将第一线程的状态设置为睡眠态,并将第一线程添加到与目标锁的地址对应的等待队列中。
第三方面,本申请实施例提供的一种电子设备,包括执行本申请实施例上述第一方面以及第一方面涉及的任一可能设计的方法的装置。
第四方面,本申请实施例提供的一种芯片,包括:处理器和接口,用于从存储器中调用并运行所述存储器中存储的程序指令,执行本申请实施例上述第一方面以及第一方面涉及的任一可能设计的方法。
第五方面,本申请实施例的一种计算机可读存储介质,该计算机可读存储介质存储有程序指令,当所述程序指令在电子设备上运行时,使得电子设备执行本申请实施例上述第一方面以及第一方面涉及的任一可能设计的方法。
第六方面,本申请实施例的一种计算机程序产品,当所述计算机程序产品在电子设备上运行时,使得所述电子设备执行实现本申请实施例上述第一方面以及第一方面涉及的任一可能设计的方法。
另外,第二方面至第六方面中任一种可能设计方式所带来的技术效果可参见方法部分相关中不同设计方式所带来的技术效果,此处不再赘述。
附图说明
图1为本申请实施例的一种锁状态变量的格式示意图;
图2为本申请实施例的一种电子设备的硬件结构示意图;
图3为本申请实施例的一种电子设备的软件结构示意图;
图4为本申请实施例的一种阻塞线程数的高位上的值的存储格式示意图;
图5为本申请实施例的一种重复持锁次数的高位上的值的存储格式示意图;
图6为本申请实施例的另一种锁状态变量的格式示意图;
图7为本申请实施例的一种哈希值的存储格式示意图;
图8为本申请实施例的一种多线程同步方法的流程示意图;
图9为本申请实施例的一种对阻塞线程数域执行加1操作的流程示意图;
图10为本申请实施例的一种对重复持锁次数域执行加1操作的流程示意图;
图11为本申请实施例的另一种多线程同步方法的流程示意图;
图12为本申请实施例的一种对重复持锁次数域执行减1操作的流程示意图;
图13为本申请实施例的另一种多线程同步方法的流程示意图;
图14为本申请实施例的一种线程等待列表的存储格式示意图;
图15为本申请实施例的一种从线程等待列表删除线程ID的流程示意图;
图16为本申请实施例的另一种多线程同步方法的流程示意图;
图17为本申请实施例的另一种多线程同步方法的流程示意图;
图18为本申请实施例的另一种锁状态变量的格式示意图;
图19为本申请实施例的另一种电子设备的结构示意图。
具体实施方式
应理解,本申请实施例中“至少一个”是指一个或者多个。“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系。例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B的三种情况。其中A、B可以是单数或者复数。字符“/”一般表示前后关联对象是一种“或”的关系。“以下至少一(项)个”或其类似表达,是指的这些项中的任意组合,包括单项(个)或复数项(个)的任意组合。例如,a、b或c中的至少一项(个),可以表示:a,b,c,a和b,a和c,b和c,或a、b和c七种情况。其中a、b、c中的每一个本身可以是元素,也可以是包含一个或多个元素的集合。
在本申请中,“示例的”、“在一些实施例中”、“在另一些实施例中”等用于表示作例子、例证或说明。本申请中被描述为“示例”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用示例的一词旨在以具体方式呈现概念。
需要指出的是,本申请实施例中涉及的“第一”、“第二”等词汇,仅用于区分描述的目的,而不能理解为指示或暗示相对重要性,也不能理解为指示或暗示顺序。
电子设备通过操作系统(例如安卓操作系统)执行相应的程序,使得用户可以使用电子设备打电话、发短消息、浏览网页、拍照、玩游戏、看视频等。通常,线程(thread)是程序执行的最小单位。目前,电子设备的操作系统可以支持多线程运行,从而实现多任务的并行处理,提高任务处理效率。然而,在安卓操作系统中,共享资源(例如,共享代码、共享内存、共享数据或变量等)可以被多线程访问。为了避免多线程同时访问资源,通过锁对共享资源保护。以锁1保护共享资源1为例。多线程中只有持有锁1的线程能够实现对共享资源1的访问,而一旦锁1被某一线程持有,则其它线程无法再对锁1持锁,只有当持锁线程释放锁1后,其它线程才获得对锁1的持锁机会。
现有技术中,线程是采用锁膨胀策略来竞争持锁的。具体的,线程是根据锁状态变量(lockword)实现竞争持锁的,换句话说,线程是根据锁状态变量,来判断是否能够对锁1持锁的。
示例的,在安卓操作系统中,lockword的格式如图1所示,包括状态位、预留位(reserve)、重复持锁次数域和持锁线程标识域。状态位用于指示锁状态。lockword的重复持锁次数域和持锁线程标识域指示的信息与锁状态有关。例如,状态位设置为01时指示重锁状态,而在状态位设置为01的情况下,重复持锁次数域和持锁线程标识域用于指示monitor对象;状态位为00时轻锁状态,在状态位设置为00的情况下,重复持锁次数域用于指示持锁线程针对锁的持锁次数,持锁线程标识域用于指示锁的持锁线程。
以线程1请求获取锁1为例。线程1请求获取锁1,具体包括以下步骤:
首先,线程1获取lockword。
其次,线程1检查持锁线程标识域。
一种情况:若线程1检查持锁线程标识域为除线程1以外的其它线程,线程1继续检查状态位。
若线程1检查状态位为重锁状态,线程1挂起进入阻塞状态。
若线程1检查状态位为轻锁状态,则进行自旋等待。在自旋等待达到某一阈值时,若检查持锁线程标识域仍为出线程1以外的其它线程,线程1将锁1的持锁线程挂起,分配monitor对象,将状态位设置为重锁状态,再唤醒锁1的持锁线程,然后线程1挂起进入阻塞状态。
另一种情况:若线程1检查锁线程标识域为线程1,线程1对重复持锁次数域执行加1操作。若检查重复持锁次数域达到某一阈值,线程1分配monitor对象,将状态位设置为重锁状态。
又一种情况,若线程1检查锁线程标识域为无效线程,即没有线程对锁1持锁,线程1将锁状态标识域设置为第一线程,并对重复持锁次数域初始化。
从上述内容可以看出,线程基于图1所示的锁状态变量,请求获取锁或请求持锁时,由于持锁线程和非持锁线程均可以对状态位进行操作,因此,在状态位为轻锁状态下,如果非持锁线程需要修改状态位,为了避免持锁线程也对状态位进行修改,因此非持锁线程需要将持锁线程挂起,并在状态位修改好后,再唤醒持锁线程。另外,不管是持锁线程,还是非持锁线程,将状态位由轻锁状态修改为重锁状态,均需要分配monitor对象,因此,线程基于现有的lockword来判断是否能够持锁的机制,容易增加持锁线程访问共享资源的时长,导致电子设备中持锁线程所在的应用程序的响应时延增大,从而增大了电子设备卡顿的概率,降低用户体验。
有鉴于此,本申请实施例提供了一种多线程同步方法,重新对锁状态变量(lockword)进行了定义,使得锁状态变量包括持锁线程标识域、重复持锁次数域和阻塞线程数域,其中,持锁线程标识域用于指示目标锁的持锁线程,重复持锁次数域用于指示持锁线程针对该目标锁的持锁次数,阻塞线程数域用于指示针对该目标锁处于阻塞状态的线程数,由于持锁线程标识域和重复持锁次数域仅由持锁线程设置,阻塞线程数域仅由非持锁线程设置,因而,使得非持锁线程自旋等待达到某一阈值时,若检查持锁线程标识域为其他线程,该非持锁线程对阻塞线程数域执行加1操作,并挂起进入阻塞状态,与现有技术相比,无需先将持锁线程挂起,也无需分配monitor对象,对阻塞线程数域执行加1操作,因而减小了持锁线程访问共享资源的时长,降低了电子设备卡顿的概率,有助于提高用户体验。
示例的,本申请实施例的电子设备可以为手机、平板电脑、可穿戴设备、车载设备、增强现实(augmented reality,AR)/虚拟现实(virtual reality,VR)设备、笔记本电脑、超级移动个人计算机(ultra-mobile personal computer,UMPC)、上网本、个人数字助理(personal digital assistant,PDA)等,本申请实施例对电子设备的具体类型不作任何限制。
示例的,如图2所示,为本申请实施例的一种电子设备的结构示意图。具体的,如图所示,电子设备包括处理器110、外部存储器接口120、内部存储器121、通用串行总线(universal serial bus,USB)接口130、充电管理模块140、电源管理模块141、电池142、天线1、天线2、移动通信模块150、无线通信模块160、音频模块170、扬声器170A、受话器170B、麦克风170C、耳机接口170D、传感器模块180、按键190、马达191、指示器192、摄像头193、显示屏194、以及用户标识模块(subscriber identification module,SIM)卡接口195等。其中,传感器模块180可以包括压力传感器、陀螺仪传感器、气压传感器、磁传感器、加速度传感器、距离传感器、接近光传感器、指纹传感器、温度传感器、触摸传感器、环境光传感器、骨传导传感器等。
处理器110可以包括一个或多个处理单元。例如:处理器110可以包括应用处理器(application processor,AP)、调制解调器(modem)、图形处理器(graphics processingunit,GPU)、图像信号处理器(image signal processor,ISP)、控制器、视频编解码器、数字信号处理器(digital signal processor,DSP)、基带处理器、和/或神经网络处理器(neural-network processing unit,NPU)等。其中,不同的处理单元可以是独立的器件,或者,两个或更多个不同的处理单元也可以集成在一个器件中。
控制器可以是电子设备的神经中枢和指挥中心。控制器可以根据指令操作码和时序信号,产生操作控制信号,完成取指令和执行指令的控制。
处理器110中还可以设置存储器,用于存储指令和数据。在一些实施例中,处理器110中的存储器为高速缓冲存储器。该存储器可以保存处理器110刚用过或循环使用的指令或数据。如果处理器110需要再次使用该指令或数据,可从所述存储器中直接调用。避免了重复存取,减少了处理器110的等待时间,因而提高了系统的效率。
在一些实施例中,处理器110可以包括一个或多个接口。例如,处理器110包括通用串行总线(universal serial bus,USB)接口130、用户标识模块(subscriber identitymodule,SIM)接口195。再例如,处理器110还可以包括集成电路(inter-integratedcircuit,I2C)接口、集成电路内置音频(inter-integrated circuit sound,I2S)接口、脉冲编码调制(pulse code modulation,PCM)接口、通用异步收发传输器(universalasynchronous receiver/transmitter,UART)接口、移动产业处理器接口(mobileindustry processor interface,MIPI)、和/或通用输入输出(general-purpose input/output,GPIO)接口等。
可以理解的是,本申请实施例示意的各模块间的接口连接关系,只是示意性说明,并不构成对电子设备的结构限定。在本申请另一些实施例中,电子设备也可以采用上述实施例中不同的接口连接方式,或多种接口连接方式的组合。
USB接口130是符合USB标准规范的接口,具体可以是Mini USB接口、Micro USB接口、USB Type C接口等。USB接口130可以用于连接充电器为电子设备充电,也可以用于电子设备与外围设备之间传输数据。也可以用于连接耳机,通过耳机播放音频。该接口还可以用于连接其他电子设备,例如AR设备等。
SIM卡接口195用于连接SIM卡。SIM卡可以通过插入SIM卡接口195,或从SIM卡接口195拔出,实现和电子设备的接触和分离。电子设备可以支持1个或N个SIM卡接口,N为大于1的正整数。SIM卡接口195可以支持Nano SIM卡、Micro SIM卡、SIM卡等。同一个SIM卡接口195可以同时插入多张卡。所述多张卡的类型可以相同,也可以不同。SIM卡接口195也可以兼容不同类型的SIM卡。SIM卡接口195也可以兼容外部存储卡。电子设备通过SIM卡和网络交互,实现通话以及数据通信等功能。在一些实施例中,电子设备采用eSIM,即:嵌入式SIM卡。eSIM卡可以嵌在电子设备中,不能和电子设备分离。
充电管理模块140用于从充电器接收充电输入。其中,充电器可以是无线充电器,也可以是有线充电器。在一些有线充电的实施例中,充电管理模块140可以通过USB接口130接收有线充电器的充电输入。在一些无线充电的实施例中,充电管理模块140可以通过电子设备的无线充电线圈接收无线充电输入。充电管理模块140为电池142充电的同时,还可以通过电源管理模块141为电子设备供电。
电源管理模块141用于连接电池142、充电管理模块140与处理器110。电源管理模块141接收电池142和/或充电管理模块140的输入,为处理器110、内部存储器121、外部存储器、显示屏194、摄像头193和无线通信模块160等供电。电源管理模块141还可以用于监测电池容量、电池循环次数、电池健康状态(漏电、阻抗)等参数。在其他一些实施例中,电源管理模块141也可以设置于处理器110中。在另一些实施例中,电源管理模块141和充电管理模块140也可以设置于同一个器件中。
电子设备的无线通信功能可以通过天线1、天线2、移动通信模块150、无线通信模块160、调制解调器以及基带处理器等实现。
天线1和天线2用于发射和接收电磁波信号。电子设备中的每个天线可用于覆盖单个或多个通信频带。不同的天线还可以复用,以提高天线的利用率。例如:可以将天线1复用为无线局域网的分集天线。在另外一些实施例中,天线可以和调谐开关结合使用。
移动通信模块150可以提供应用在电子设备上的包括2G/3G/4G/5G等制式的无线通信的解决方案。移动通信模块150可以包括至少一个滤波器、开关、功率放大器、低噪声放大器(low noise amplifier,LNA)等。
无线通信模块160包括可以提供应用在电子设备上的包括无线局域网(wirelesslocal area networks,WLAN)(如Wi-Fi网络)、蓝牙(bluetooth,BT)、全球导航卫星系统(global navigation satellite system,GNSS)、调频(frequency modulation,FM)、近距离无线通信技术(near field communication,NFC)、红外技术(infrared,IR)等无线通信的解决方案。
在一些实施例中,电子设备的天线1和移动通信模块150耦合,天线2和无线通信模块160耦合,使得电子设备可以通过无线通信技术与网络以及其他设备通信。所述无线通信技术可以包括全球移动通讯系统(global system for mobile communications,GSM)、通用分组无线服务(general packet radio service,GPRS)、码分多址接入(code divisionmultiple access,CDMA)、宽带码分多址(wideband code division multiple access,WCDMA)、时分码分多址(time-division code division multiple access,TD-SCDMA)、长期演进(long term evolution,LTE)、BT、GNSS、WLAN、NFC、FM和/或IR技术等。所述GNSS可以包括全球卫星定位系统(global positioning system,GPS)、全球导航卫星系统(globalnavigation satellite system,GLONASS)、北斗卫星导航系统(beidou navigationsatellite system,BDS)、准天顶卫星系统(quasi-zenith satellite system,QZSS)和/或星基增强系统(satellite based augmentation systems,SBAS)。
电子设备通过GPU、显示屏194以及应用处理器等实现显示功能。显示屏194用于显示图像、视频等。显示屏194包括显示面板。显示面板可以采用液晶显示屏(liquid crystaldisplay,LCD)、有机发光二极管(organic light-emitting diode,OLED)、有源矩阵有机发光二极体或主动矩阵有机发光二极体(active-matrix organic light emitting diode的,AMOLED)、柔性发光二极管(flex light-emitting diode,FLED)、Miniled、MicroLed、Micro-oLed、量子点发光二极管(quantum dot light emitting diodes,QLED)等。在一些实施例中,电子设备可以包括1个或N个显示屏194,N为大于1的正整数。
电子设备可以通过ISP、摄像头193、视频编解码器、GPU、显示屏194以及应用处理器等实现拍摄功能。ISP用于处理摄像头193反馈的数据。例如,拍照时,打开快门,光线通过镜头被传递到摄像头感光元件上,光信号转换为电信号,摄像头感光元件将所述电信号传递给ISP处理,转化为肉眼可见的图像。ISP还可以对图像的噪点,亮度,肤色进行算法优化。ISP还可以对拍摄场景的曝光、色温等参数优化。在一些实施例中,ISP可以设置在摄像头193中。
摄像头193用于捕获静态图像或视频。物体通过镜头生成光学图像投射到感光元件。感光元件可以是电荷耦合器件(charge coupled device,CCD)或互补金属氧化物半导体(complementary metal-oxide-semiconductor,CMOS)光电晶体管。感光元件把光信号转换成电信号,之后将电信号传递给ISP转换成数字图像信号。ISP将数字图像信号输出到DSP加工处理。DSP将数字图像信号转换成标准的RGB,YUV等格式的图像信号。在一些实施例中,电子设备可以包括1个或N个摄像头193,N为大于1的正整数。
外部存储器接口120可以用于连接外部存储卡,例如Micro SD卡,实现扩展电子设备的存储能力。外部存储卡通过外部存储器接口120与处理器110通信,实现数据存储功能。例如将音乐、视频等文件保存在外部存储卡中。
内部存储器121包括运行内存(memory)和内置存储器。其中,运行内存可以用于存储计算机可执行程序代码或数据等。所述可执行程序代码包括指令。处理器110通过运行存储在运行内存的指令,从而执行电子设备的各种功能应用以及数据处理。例如,运行内存可以包括高速随机存取存储器。而内置存储器又可以称之为内置外存等,可以用于存储程序和/或数据。例如,内置存储器可以存储操作系统、应用程序等。电子设备通常将内置存储器中的程序和/或数据加载到运行内存后,使得处理器110运行相应的程序和/或数据,实现相应的功能。此外,内部存储器121可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、通用闪存存储器(universal flash storage,UFS)等。
电子设备可以通过音频模块170、扬声器170A、受话器170B、麦克风170C、耳机接口170D、以及应用处理器等实现音频功能。例如音乐播放、录音等。
按键190包括开机键、音量键等。按键190可以是机械按键。也可以是触摸式按键。电子设备可以接收按键输入,产生与电子设备的用户设置以及功能控制有关的键信号输入。
马达191可以产生振动提示。马达191可以用于来电振动提示,也可以用于触摸振动反馈。例如,作用于不同应用(例如拍照、音频播放等)的触摸操作,可以对应不同的振动反馈效果。作用于显示屏194不同区域的触摸操作,马达191也可对应不同的振动反馈效果。不同的应用场景(例如:时间提醒、接收信息、闹钟、游戏等)也可以对应不同的振动反馈效果。触摸振动反馈效果还可以支持自定义。
指示器192可以是指示灯,可以用于指示充电状态、电量变化,也可以用于指示消息、未接来电、通知等。
可以理解的是,本申请实施例示意的结构并不构成对电子设备的具体限定。在本申请另一些实施例中,电子设备可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
本申请实施例中电子设备的软件系统又可以称之为操作系统,支持多线程运行,可以采用分层架构、事件驱动架构、微核架构、微服务架构、或云架构。其中,分层架构(如,安卓操作系统)将软件分成若干个层,每一层都有清晰的角色和分工,层与层之间通过软件接口通信。
具体的,图3示出本申请实施例的电子设备的一种软件系统的结构框图。分层架构将软件分成若干个层,每一层都有清晰的角色和分工。层与层之间通过软件接口通信。在一些实施例中,将Android系统分为四层,从上至下分别为应用程序层、应用程序框架层、安卓运行时(Android runtime)和系统库、以及内核层。应用程序层可以包括一系列应用程序包。
如图3所示,应用程序包可以包括相机、图库、日历、通话、地图、导航、WLAN、蓝牙、音乐、视频、短信息等应用程序。
应用程序框架层为应用程序层的应用程序提供应用编程接口(applicationprogramming interface,API)和编程框架。应用程序框架层包括一些预先定义的函数。
如图3所示,应用程序框架层可以包括窗口管理器、内容提供器、视图系统、电话管理器、资源管理器、通知管理器等。
窗口管理器用于管理窗口程序。窗口管理器可以获取显示屏大小,判断是否有状态栏、锁定屏幕、截取屏幕等。
内容提供器用来存放和获取数据,并使这些数据可以被应用程序访问。所述数据可以包括视频、图像、音频、拨打和接听的电话、浏览历史和书签、电话簿等。
视图系统包括可视控件,例如显示文字的控件,显示图片的控件等。视图系统可用于构建应用程序。显示界面可以由一个或多个视图组成的。例如,包括短信通知图标的显示界面,可以包括显示文字的视图以及显示图片的视图。
电话管理器用于提供电子设备100的通信功能。例如通话状态的管理(包括接通、挂断等)。
资源管理器为应用程序提供各种资源,比如本地化字符串、图标、图片、布局文件、视频文件等等。
通知管理器使应用程序可以在状态栏中显示通知信息,可以用于传达告知类型的消息,可以短暂停留后自动消失,无需用户交互。比如通知管理器被用于告知下载完成,消息提醒等。通知管理器还可以是以图表或者滚动条文本形式出现在系统顶部状态栏的通知,例如后台运行的应用程序的通知,还可以是以对话窗口形式出现在屏幕上的通知。例如在状态栏提示文本信息,发出提示音,电子设备振动,指示灯闪烁等。
Android Runtime包括核心库和虚拟机(该虚拟机又可以成为java虚拟机,如Dalvik虚拟机)。Android runtime负责安卓系统的调度和管理。
核心库包含两部分:一部分是java语言需要调用的功能函数,另一部分是安卓的核心库。
应用程序层和应用程序框架层运行在虚拟机中。虚拟机将应用程序层和应用程序框架层的java字节码(bytecode)翻译为二进制执行文件。虚拟机用于执行对象生命周期的管理、堆栈管理、线程管理、安全和异常的管理、以及垃圾回收等功能。示例的,本申请实施例的多线程访问方法是通过虚拟机执行的。其中,当图3所示的软件架构为安卓操作系统时,虚拟机可以为Dalvik/ART、或者HUAWEI maple等。当图3所示的软件架构为Linux或者Windows等操作系统时,虚拟机可以为openJDK虚拟机。
需要说明的是,虚拟机可以是在启动应用程序时创建的,也可以是在预先安装好的,对此不作限定。例如,在安卓操作系统中,虚拟机可以是在启动应用程序时创建的。再例如,在Widows操作系统中,虚拟机可以是用户根据自身需求安装在电子设备上的。
系统库可以包括多个功能模块。例如:表面管理器(surface manager)、媒体库(Media Libraries)、三维图形处理库(例如:OpenGL ES)、2D图形引擎(例如:SGL)等。
表面管理器用于对显示子系统进行管理,并且为多个应用程序提供了2D和3D图层的融合。
媒体库支持多种常用的音频,视频格式回放和录制,以及静态图像文件等。媒体库可以支持多种音视频编码格式,例如:MPEG4、H.264,MP3、AAC、AMR、JPG、PNG等。
三维图形处理库用于实现三维图形绘图,图像渲染、合成和图层处理等。
2D图形引擎是2D绘图的绘图引擎。
内核层是硬件和软件之间的层。内核层至少包含显示驱动、摄像头驱动、音频驱动、传感器驱动。
首先,对本申请实施例中涉及的部分名词进行解释,以便于本领域技术人员理解。
1、锁。本申请实施例的锁用于保护共享资源不被多个线程同时访问。本申请实施例中的共享资源可以被多个线程访问,例如内存、代码、变量或数据等,对此不作限定。示例的,锁可以为对象(object,obj)或者对象的一部分,其中,对象用于保护共享资源,为一个类的实例,其中,类为一个模板,描述了一类对象的行为和状态。又示例的,锁还可以为地址或者其他唯一确定的参数或结构体等。
2、锁状态变量(lockword)。本申请实施例中,lockword包括持锁线程标识域、重复持锁次数域和阻塞线程数域,可以为32比特,也可以为64比特,本申请实施例对lockword的比特数不作限定。进一步的,在另一些实施例中,lockword还可以包括预留位,以便于后续对进行功能或操作扩展。
具体的,lockword与锁是一一对应的,不同的锁的lockword是不同的。以目标锁的lockword为例。
持锁线程标识域用于指示目标锁的持锁线程。示例的,以第一线程为例,第一线程可以通过将持锁线程标识域设置为第一线程获得目标锁。具体的,第一线程可以通过将第一线程的线程ID设置在持锁线程标识域上,实现将持锁线程标识域设置为第一线程。
阻塞线程数域用于指示针对目标锁处于阻塞状态的线程数。
进一步的,在一些实施例中,阻塞线程数域包括第一值和阻塞线程数高位标识。第一值为针对目标锁处于阻塞状态的线程数的低位上的值,阻塞线程数高位标识用于指示阻塞线程数高位列表中是否存储有与目标锁的ID对应的第二值。第二值为针对目标锁处于阻塞状态的线程数的高位上的值。从而有助于避免针对目标锁处于阻塞状态的线程数过多时,导致溢出。示例的,当阻塞线程数高位标识为有效标识时,指示阻塞线程数高位列表中存储有与目标锁的ID对应的第二值。当阻塞线程数高位标识为无效标识时,指示阻塞线程数高位列表中未存储有与目标锁的ID对应的第二值,或与目标锁的ID对应的第二值为0。例如,将阻塞线程数高位标识置1时,即阻塞线程数高位标识为有效标识。再例如,将阻塞线程数高位标识置0时,即阻塞线程数高位标识为无效标识。
示例的,阻塞线程数高位列表可以为全局变量,以map的形式存储在电子设备中。以与目标锁的ID对应的第二值为例,阻塞线程数高位列表中存储的与目标锁的ID对应的第二值的格式如图4所示,目标锁的ID为key,第二值为vlaue,从而使得请求获取目标锁的线程可以通过目标锁的ID从阻塞线程数高位列表中索引第二值。
重复持锁次数域用于指示持锁线程针对目标锁的持锁次数。具体的,在本申请实施例中,持锁线程可以通过将重复持锁系数域设置为持锁线程针对目标锁的重复持锁次数,来指示持锁线程针对目标锁的持锁次数。或者,也可以将重复持锁系数域直接设置为持锁线程针对目标锁的持锁次数。例如,在持锁线程针对目标锁的持锁次数为1的情况下,持锁线程针对目标锁的重复持锁次数为0,即持锁线程可以将重复持锁系数域设置为0,也可以设置为1,来指示持锁线程针对目标锁的持锁次数为1。此外,在一些实施例中,持锁线程可以通过将重复持锁次数域设置为空,来指示持锁线程针对目标锁的持锁次数为0。或者,持锁线程可以通过将重复持锁次数域设置为特定符号或值指示持锁线程针对目标锁的持锁次数为0。例如,在持锁线程通过将重复持锁系数域直接设置为持锁线程针对目标锁的持锁次数的情况下,持锁线程可以通过将重复持锁次数域设置为0,来指示持锁线程针对目标锁的持锁次数为0。再例如,在持锁线程通过将重复持锁系数域设置为持锁线程针对目标锁的重复持锁次数的情况下,持锁线程可以通过将重复持锁次数域设置为none,来指示持锁线程针对目标锁的持锁次数为0。
进一步的,在一些实施例中,重复持锁系数域包括第三值和重复持锁次数高位标识。其中,第三值为持锁线程针对目标锁的持锁次数的低位上的值,重复持锁次数高位标识用于指示重复持锁次数高位列表中是否存储有与目标锁的ID和持锁线程的线程ID对应的第四值,第四值为持锁线程针对所述目标锁的持锁次数的高位上的值。从而有助于避免持锁线程对目标锁持锁次数过多时,导致溢出。示例的,当重复持锁次数高位标识为有效标识时,指示重复持锁次数高位列表中存储有与目标锁的ID和持锁线程的线程ID对应的第四值。当重复持锁次数高位标识为无效标识时,指示重复持锁次数高位列表中未存储有与目标锁的ID和持锁线程的线程ID对应的第四值,或与目标锁的ID和持锁线程的线程ID对应的第四值为0。例如,将重复持锁次数高位标识置1时,即重复持锁次数高位标识为有效标识。再例如,将重复持锁次数高位标识置0时,即重复持锁次数高位标识为无效标识。
示例的,重复持锁次数高位列表可以为全局变量,以map的形式存储在电子设备中。以与目标锁的ID和持锁线程的线程ID对应的第四值为例,重复持锁次数高位列表中存储的与目标锁的ID和持锁线程的线程ID对应的第四值的格式如图5所示,目标锁的ID和持锁线程的线程ID为key,第四值为vlaue,从而使得请求重新获取目标锁的线程可以通过目标锁的ID和线程ID从重复持锁次数高位列表中索引第四值。
例如,在lockword为32比特的情况下,目标锁的lockword可以如图6所示,包括持锁线程标识域、重复持锁次数域、阻塞线程数域和预留位。其中,重复持锁次数域包括Counter域和M1域,阻塞线程数域包括WaitNum域和M2域。Counter域用于设置第一值,M1域用于设置重复持锁次数高位标识。WaitNum域用于设置第三值,M2域用于设置阻塞线程数高位标识。
如图6所示,lockword的前16比特(即第0~15比特)为持锁线程标识域,lockword的第16~18比特为Counter域。lockword的第19比特为M1域。lockword的第20~28比特为WaitNum域,第30和31比特为预留位。需要说明的是,在lockword中还可以不设置预留位。或者,根据实际需要设置lockword中各个域的比特数等。
需要说明的是,图6仅为对目标锁的lockword的格式的举例说明,并不构成对lockword格式的限定。例如,本申请实施例中还可以根据实际需要设置lockword中各个域的比特数等。
另外,在又一些实施例中,目标锁的hashcode(哈希值)用于指示是否存在目标锁。以目标锁为某一对象为例,该目标锁的hashcode存储在该对象的对象头的地址负偏移9个比特对应的内存空间中。或者,在用于存储目标锁的lockword的地址对应的内存空间中为空的情况下,电子设备可以将目标锁的hashcode存储在用于存储目标锁的lockword的地址对应的内存空间中,从而有助于内存空间的合理利用。进一步的,本申请实施例可以目标锁的hashcode可以以map形式存储。示例的,目标锁的hashcode的存储格式可以如图7所示,目标锁的ID为key,hashcode为value。具体的,线程可以通过目标锁的ID索引到目标锁的hashcode。
以具有图2和图3所示结构的电子设备为例,对本申请实施例的多进程同步方法进行详细介绍。
示例一:以第一线程请求获取目标锁为例。其中,第一线程请求获取目标锁可以理解为:第一线程请求对目标锁持锁。在一些实施例中,第一线程运行到请求获取目标锁持锁的函数或程序指令时,触发执行第一线程请求获取目标锁的过程。例如,请求获取目标锁持锁的函数或程序指令为MonitorEnter。
示例的,第一线程请求获取目标锁,包括以下步骤,具体如图8所示。
步骤801、第一线程获取目标锁的lockword。
示例的,第一线程根据目标锁的地址,获取目标锁的lockword。例如,在lockword为32比特的情况下,目标锁的地址可以为目标锁所在对象的对象头的地址正向偏移4字节。
步骤802、第一线程检查持锁线程标识域是否为有效线程。即第一线程判断持锁线程标识域是否设置为有效线程。若是,则执行步骤803,否则执行809。
需要说明的是,持锁线程标识域不为有效线程,与持锁线程标识域为无效线程等同。
具体的,持锁线程标识域设置为有效线程,可以理解为:在持锁线程标识域上设置的线程ID为有效值。例如,[1,1000]为线程ID的有效值,则在持锁线程标识域上设置的线程ID在[1,1000]中,即持锁线程域设置为有效线程。可以理解的是,当在持锁线程标识域上设置的线程ID不是有效值,可以理解为持锁线程ID设置为无效线程。例如,持锁线程标识域设置的线程ID为0、或1001,0、1001均不在[1,1000]中,则持锁线程标识域设置为无效线程。需要说明的是,当持锁线程标识域设置为无效线程时,可以理解为目标锁处于无锁状态(non_lock)。
在另一些实施例中,持锁线程标识域设置为无效线程,还可以通过在持锁线程标识域上设置特定的值或符号实现,例如,将持锁线程标识域设置为NA时,即将持锁线程标识域设置为无效线程。
步骤803、第一线程检查持锁线程域是否为第一线程,若是,则执行步骤808,否则执行步骤804。
步骤804、第一线程检查阻塞线程数域是否小于第一阈值,若是,则执行步骤805,否则执行步骤807。
示例的,第一阈值可以为3、4或5等,具体可以是电子设备出厂之前设定好的,也可以是电子设备根据自身的运行情况确定的,对此不作限定。例如,电子设备自身运行速度较快的情况下,第一阈值可以取值大一些,在电子设备自身运行卡顿的情况下,第一阈值的取值可以小一些。
步骤805、第一线程进行自旋等待。
在一些实施例中,第一线程可以通过下列方式进行自旋等待:
第一线程调用sched_yield系统函数,向处理器发送yield指令。处理器接收到yield指令后,在一定时长内将第一线程挂起,从而使得第一线程放弃对处理器的在一定时长内控制权,进行自旋等待。
需要说明的是,本申请实施例中,电子设备还可以通过其它方式进行自旋等待,对此不作限定。
步骤806、第一线程在自旋等待的次数达到第二阈值时,若检查持锁线程标识域为有效线程且不为第一线程,则第一线程对阻塞线程数域执行加1的操作,并挂起进入阻塞状态。
在一些实施例中,阻塞线程数域包括第一值和阻塞线程数高位标识,具体可以参见上述相关介绍。在这种情况下,第一线程对阻塞线程数域执行加1的操作可以如图9所示,具体可以包括以下步骤:
步骤901、第一线程检查第一值是否等于第一目标值,第一目标值为针对目标锁处于阻塞状态的线程数的低位上的最大值。若是,则执行步骤903,否则,执行步骤902。
即第一线程比较或判断第一值与第一目标值是否相同。
步骤902、第一线程将第一值加1。
例如,在lockword中的3比特上设置针对目标锁处于阻塞状态的线程数的低位上的值。在这种情况下,第一目标值为7,当第一值为4时,第一线程对第一值加1,将第一值设置为5。
步骤903、第一线程检查阻塞线程数高位标识是否为有效标识,若是,则执行步骤904,否则执行步骤905。
可以理解的是,阻塞线程数高位标识不为有效标识,与阻塞线程数为无效标识等同。
步骤904、第一线程将第一值置0,以及将阻塞线程列表中与目标锁的ID对应的第二值加1。
步骤905、第一线程将第一值置0,将阻塞线程数高位标识设置为有效标识,将与目标锁的ID对应的第二值置1,以及将目标锁的ID和与目标锁的ID对应的第二值添加或存储到阻塞线程列表中。
在一些实施例中,第一线程可以通过下述方式挂起进入阻塞状态:
第一线程进行系统调用,将第一线程的状态设置为睡眠态,并将第一线程添加到与目标锁的地址对应的等待队列中。示例的,第一线程基于快速用户空间互斥体(fastuser mutex,futex)机制进行系统调用,将第一线程的状态设置为睡眠态,并将第一线程添加到与目标锁的地址对应的等待队列中。例如,第一线程可以通过系统调用futex_wait,挂起进入阻塞状态。
在本申请的另一些实施例中,第一线程在自旋等待的次数小于第二阈值的情况下,将持锁线程标识域设置为第一线程,第一线程对目标锁所保护的共享资源进行访问。
步骤807、第一线程对阻塞线程数域执行加1的操作,并挂起进入阻塞状态。
其中,第一线程对阻塞线程数域执行加1的操作,并挂起进入阻塞状态的具体实现方式,可以参见步骤806中的相关介绍,在此不再赘述。
步骤808、第一线程对重复持锁次数域执行加1操作。
在一些实施例中,重复持锁次数域包括第三值和重复持锁次数高位标识,具体可以参见上述相关介绍。在这种情况下,第一线程对重复持锁次数执行加1的操作可以如图10所示,具体可以包括以下步骤:
步骤1001、第一线程检查第三值是否等于第二目标值,第二目标值为持锁线程针对目标锁的持锁次数的低位上的最大值。若是,则执行步骤1003,否则,执行步骤1002。
步骤1002、第一线程将第三值加1。
例如,在lockword中的5比特上设置持锁线程针对目标锁的持锁次数的低位上的值。在这种情况下,第二目标值为31,当第三值为20时,第一线程将第三值加1,将第三值设置为21。
步骤1003、第一线程检查重复持锁次数高位标识是否为有效标识,若是,则执行步骤1004,否则,执行步骤1005。
步骤1004、第一线程将第三值置0,将重复持锁次数高位列表中与目标锁的ID和持锁线程的线程ID对应的第四值加1。
步骤1005、第一线程将第三值置0,将重复持锁次数高位标识设置为有效标识,并与目标锁的ID和持锁线程的线程ID对应的第四值置1,以及将目标锁的ID、持锁线程的线程ID和与目标锁的ID和持锁线程的线程ID对应的第四值添加或存储到阻塞线程列表中。
步骤809,第一线程将持锁线程标识域设置为第一线程,以及初始化重复持锁次数域。
其中,第一线程初始化重复持锁次数域,可以理解为,第一线程将重复持锁次数域设置为初始值。例如,在初始值为0的情况下,第一线程将重复持锁次数域设置为0。在初始值为1的情况下,第一线程将重复持锁次数域设置为1。
示例的,在持锁线程通过将重复持锁系数域直接设置为持锁线程针对目标锁的持锁次数的情况下,初始值可以为1。示例的,在持锁线程通过将重复持锁系数域设置为持锁线程针对目标锁的重复持锁次数的情况下,初始值可以为0。
本申请实施例中,由于第一线程在自旋等待的次数达到第二阈值时,第一线程只需对阻塞线程数域执行加1操作,并挂起进入阻塞状态即可,无需将针对目标锁的持锁线程挂起,也无需分配monitor对象,从而有助于减小持锁线程访问共享资源的时长,从而有助于降低电子设备卡顿的概率,提高用户体验。
另外,本申请实施例中,当第一线程为持锁线程时,如果对目标锁重复持锁,只需对重复持锁线程数执行加1操作即可,无需分配monitor对象,修改锁状态,因而,有助于提高第一线程的处理效率,提高电子设备的运行速度,从而有助于提高用户体验。
示例二:以第一线程请求释放目标锁为例。在一些实施例中,第一线程运行到请求释放目标锁的函数或程序指令时,触发执行第一线程请求释放目标锁的过程。例如,请求释放目标锁的函数或程序指令为MonitorExit。
示例的,第一线程请求释放目标锁,包括以下步骤,具体如图11所示。
步骤1101、第一线程获取目标锁的lockword。具体可参见步骤801的相关介绍。
步骤1102,第一线程检查持锁线程标识域是否为第一线程,若是,则执行步骤1103,否则执行步骤1107。
例如,第一线程比较持锁线程标识域是否为第一线程的线程ID。
步骤1103,第一线程检查重复持锁次数域是否为0,若是,则执行步骤1106,否则执行步骤1104。
需要说明的是,重复持锁次数不为0,可以理解为重复持锁次数指示的持锁线程针对目标锁的持锁次数大于0。重复持锁次数为0,可以理解为重复持锁次数指示的持锁线程针对目标锁的持锁次数为0。
步骤1104,第一线程对重复持锁次数域执行减1操作。
在一些实施例中,重复持锁次数域包括第三值和重复持锁次数高位标识,具体可以参见上述相关介绍。在这种情况下,第一线程对重复持锁次数执行减1的操作可以如图12所示,具体可以包括以下步骤:
步骤1201、第一线程检查第三值是否为0,即第一线程判断持锁线程(即第一线程)针对目标锁的持锁次数是否为0。若否,则执行步骤1202,若是,则执行步骤1203。
步骤1202、第一线程将第三值减1。
例如,在lockword中的5比特上设置持锁线程针对目标锁的持锁次数的低位上的值。在这种情况下,当第三值为20时,第一线程将第三值减1,将第三值设置为19。
步骤1203、第一线程检查重复持锁次数高位标识是否为有效标识,若是,则执行步骤1204,否则执行步骤1207。
步骤1204、第一线程检查重复持锁次数高位列表中与目标锁的ID和持锁线程的线程ID对应的第四值是否为1,若是,则执行步骤1205,否则执行步骤1206。
需要说明的是,重复持锁次数高位列表中与目标锁的ID和持锁线程的线程ID对应的第四值不为1,可以理解为重复持锁次数高位列表中与目标锁的ID和持锁线程的线程ID对应的第四值大于1。
步骤1205、第一线程将第三值置为第二目标值,删除重复持锁次数高位列表中目标锁的ID、持锁线程的线程ID和与目标锁的ID和持锁线程的线程ID对应的第四值,以及将重复持锁次数高位标识设置为无效标识。
步骤1206、第一线程将第三值置为第二目标值,以及将与目标锁的ID和持锁线程的线程ID对应的第四值减1。
步骤1207、第一线程抛出异常。
步骤1105、第一线程对重复持锁次数域执行减1操作后,第一线程重新检查重复持锁次数域是否为0,若是,则执行步骤1106,否则本流程结束。
步骤1106、第一线程将持锁线程标识域设置为无效线程,以及检查阻塞线程数域是否为0,若否,则执行步骤1107,否则本流程结束。
步骤1107、第一线程唤醒针对目标锁处于阻塞状态的N个线程。进一步的,第一线程在唤醒目标锁处于阻塞状态的N个线程后,还可以对阻塞线程数域执行减N的操作。或者,第一线程唤醒针对目标锁处于阻塞状态的N个线程,不对阻塞线程数域执行减N操作,当N个线程中的某一个线程将持锁线程标识域设置为该线程后,由该线程对阻塞线程数域执行减1的操作,N个线程中的其它N-1个线程可以重新挂起进入阻塞状态。例如,当N个线程中的第三线程将持锁线程标识域设置为第三线程,第三线程对阻塞线程数域执行减1的操作。
其中,N为大于或等于1的正整数。例如,N可以为1或2,也可以为3,还可以为针对目标锁处于阻塞状态的所有线程的个数。其中,N的取值可以是开发人员根据需要在代码中预先设置好的。
在一些实施例中,第一线程可以基于下列方式唤醒针对目标锁处于阻塞状态的至少一个线程:
第一线程进行系统调用,将与目标锁的地址对应的等待队列中的至少一个线程的状态设置为运行态,并将至少一个线程添加到与目标锁的地址对应的运行队列中;与目标锁的地址对应的等待队列中包括针对目标锁处于阻塞状态的至少一个线程。
示例的,第一线程可以基于futex机制进行系统调用,唤醒针对目标锁处于阻塞状态的至少一个线程。例如,第一线程系统调用futex_wake,唤醒针对目标锁处于阻塞状态的至少一个线程。
步骤1108、第一线程检查持锁线程标识域是否为无效线程,若是,执行步骤1109,否则执行步骤1110。
步骤1109、第一线程抛出no-lock异常。
步骤1110,第一线程抛出other-lock异常。
示例三:以第一线程请求中止对目标锁持锁为例。其中,第一线程请求中止对目标锁持锁可以理解为:第一线程在对目标锁持锁且未释放目标锁的情况下主动请求放弃对目标锁持锁。在一些实施例中,第一线程运行到请求中止对目标锁持锁的函数或程序指令时,触发执行第一线程请求中止对目标锁持锁的过程。例如,请求中止对目标锁持锁的函数或程序指令为MonitorWait。
示例的,第一线程请求中止对目标锁持锁,包括以下步骤,具体如图13所示。
步骤1301、第一线程获取目标锁的lockword。具体可以参见步骤801中的相关介绍,在此不再赘述。
步骤1302、第一线程检查持锁线程标识域是否为第一线程,若是,则执行步骤1303,否则退出。
步骤1303、第一线程将重复持锁次数域保存为第一线程针对目标锁的上下文。
其中,第一线程将重复持锁次数域保存为第一线程针对目标锁的上下文,可以理解为:第一线程将针对目标锁的持锁次数保存为第一线程针对目标锁的上下文。
示例的,在重复持锁次数域包括第三值和重复持锁次数高位标识、且重复持锁次数高位标识为有效标识的情况下,第一线程将针对目标锁的持锁次数保存为第一线程针对目标锁的上下文,可以指的是,第一线程将第三值、重复持锁次数高位标识、以及重复持锁次数高位列表中与目标锁的ID和持锁线程的线程ID对应的第四值保存为第一线程针对目标锁的上下文。或者,第一线程根据第三值、重复持锁次数高位标识和重复持锁次数高位列表中与目标锁的ID和持锁线程的线程ID对应的第四值,确定第五值,其中第五值为第一线程针对目标锁的持锁次数,并将第五值保存为第一线程针对目标锁的上下文。
例如,第三值为7,重复持锁系数高位标识为有效标识、重复持锁次数高位列表中与目标锁的ID和持锁线程的线程ID对应的第四值为1,在持锁线程针对目标锁的持锁次数的低位上的最大值为7的情况下,第五值为15。第一线程可以将15保存为第一线程针对目标锁的上下文,也可以将7、重复持锁系数高位标识和1保存为第一线程针对目标锁的上下文。
又示例的,在重复持锁次数域包括第三值和重复持锁次数高位标识、且重复持锁次数高位标识为无效标识的情况下,第一线程将针对目标锁的持锁次数保存为第一线程针对目标锁的上下文,可以指的是,第一线程将第三值保存为第一线程针对目标锁的上下文、或者第一线程将第三值和重复持锁次数高位标识保存为第一线程针对目标锁的上下文。
示例的,第一线程可以将第一线程针对目标锁的上下文可以存储在指定的存储空间中。
步骤1304,第一线程将第一线程的线程ID添加到与目标锁的ID对应的线程等待列表中。
示例的,第一线程可以通过以下方式将第一线程的线程ID添加到目标锁的ID对应的线程等待列表中:
首先,第一线程根据目标锁的ID,查找与目标锁的ID对应的线程等待列表。第一线程若未查找到与目标锁的ID对应的线程等待列表,第一线程创建与目标锁的ID对应的线程等待列表,并将第一线程的线程ID添加到与目标锁的ID对应的线程等待列表中。第一线程若查找到与目标锁的ID对应的线程等待列表,第一线程将第一线程的线程ID添加到与目标锁的ID对应的线程等待列表中。
在一些实施例中,与目标锁的ID对应的线程等待列表可以为全局变量,以单项链表的形式存储在电子设备中。以第一线程的线程ID为例,第一线程的线程ID在与目标锁的ID对应的线程等待列表存储的格式可以如图14所示,目标锁的ID为key,第一线程的线程ID为value。从而可以通过目标锁的ID可以从与目标锁的ID对应的线程等待列表中索引到第一线程的线程ID。
步骤1305、第一线程将重复持锁次数域置0,以及将持锁线程标识域设置为无效线程,并挂起进入阻塞状态。从而在第一线程对目标锁持锁、但未释放锁的情况下主动放弃对目标锁的控制权,使得其它线程,尤其是业务优先级高于第一线程的线程可以实现优先持锁,对共享资源访问,满足用户的需求。
具体的,第一线程将重复持锁次数域置0指的是:第一线程将重复持锁次数域指示的持锁次数清0。例如,在重复持锁次数域包括第三值和重复持锁次数高位标识、且重复持锁次数高位标识为有效标识的情况下,第一线程将重复持锁次数域置0指的是:第一线程将第三值置0,将重复持锁次数高位标识设置为无效标识,以及将重复持锁次数高位列表中与目标锁的ID和第一线程的线程ID对应的第四值置0。
需要说明的是,第一线程挂起进入阻塞状态的具体实现方式,可以参见步骤805中的相关介绍,在此不再赘述。
进一步的,第一线程在执行步骤1305后,若重新被唤醒,第一线程可以重新请求获取目标锁,具体包括下述步骤:
步骤1306,第一线程重新获取目标锁的锁状态变量。
步骤1307,第一线程检查持锁线程标识域是否为无效线程,若是,则执行步骤1308,否则继续检查持锁线程标识域是否为无效线程。
步骤1308,第一线程将持锁线程标识域设置为第一线程,以及根据第一线程针对目标锁的上下文,设置重复持锁次数域。
例如,第一线程针对目标锁的上下文包括的第一线程针对目标锁的持锁次数为15,第一线程将重复持锁次数域设置为14或15。具体的,通过将持锁线程针对目标锁的重复持锁次数设置重复持锁系数域的情况下,第一线程将重复持锁次数域设置为14;通过将持锁线程针对目标锁的持锁次数设置重复持锁系数域的情况下,第一线程将重复持锁次数域设置为15。
进一步的,在一些实施例中,重复持锁次数域包括第三值和重复持锁次数高位标识。在重复持锁次数域中通过3比特设置第三值时,若第一线程针对目标锁的上下文包括的第一线程针对目标锁的持锁次数为15,则第一线程将第三值设置为6或7,将重复持锁次数高位标识设置为有效标识,以及与目标锁的ID和第一线程的线程ID对应的第四值设置为1,并将目标锁的ID、第一线程的线程ID和与目标锁的ID和第一线程的线程ID对应的第四值添加或存储到重复持锁次数高位列表中。
步骤1309,第一线程删除与目标锁的ID对应的线程等待列表中第一线程的线程ID。
示例的,如图15所示,第一线程删除与目标锁的ID对应的线程等待列表中第一线程的线程ID,具体可以包括以下步骤:
步骤1501、第一线程根据目标锁的ID,查找与目标锁的ID对应的线程等待列表。
步骤1502、第一线程若未查找到与目标锁的ID对应的线程等待列表,则异常挂死。
步骤1503、第一线程若查找到与目标锁的ID对应的线程等待列表,第一线程从与目标锁的ID对应的线程等待列表中查找第一线程的线程ID。
步骤1504、第一线程若查找到第一线程的线程ID,第一线程删除第一线程的线程ID。
步骤1505、第一线程若未查找到第一线程的线程ID,第一线程异常挂死。
此外,针对主动放弃持目标锁的线程可以通过下述方式唤醒:
方式一:第二线程根据目标锁的ID,查找与目标锁的ID对应的线程等待列表。第二线程当查找到与目标锁的ID对应的线程等待列表后,检查与目标锁的ID对应的线程等待列表。第二线程若检查与目标锁的ID对应的线程等待列表不为空,即与目标锁的ID对应的线程等待列表中存储有线程ID,则第二线程从与目标锁的ID对应的线程等待列表中选择至少一个线程ID,并唤醒与至少一个线程ID标识的线程。
其中,第二线程可以为与目标锁的ID对应的线程等待列表中一个或多个线程ID所标识的线程属于同一进程、且处于运行态的线程。第二线程可以每隔一定时长检查与目标锁的ID对应的线程等待列表是否为空。
例如,第二线程从与目标锁的ID对应的线程等待列表中选择第一个线程ID,并唤醒与第一个线程ID标识的线程。在第一个线程ID指示第一线程的情况下,第一线程被唤醒。
方式二、系统在检查或检测到第一线程的线程ID位于与目标锁的ID对应的线程等待列表中时,系统从第一线程挂起进入阻塞状态启动定时器,在定时器达到定时时长后,唤醒第一线程。
上述仅为针对主动放弃持目标锁的线程的唤醒方式的举例说明,并不构成对针对主动放弃持目标锁的线程的唤醒方式的限定。
另外,可以理解的是,在第一线程请求中止对目标锁持锁的过程中,第一线程的中断(interrupt)状态发生变化,则抛出异常。例如,第一线程在执行步骤1305中挂起进入阻塞状态的过程中,第一线程的中断(interrupt)状态发生变化,则抛出异常,不再继续执行后续步骤。再例如,第一线程在被唤醒的过程中,第一线程的中断(interrupt)状态发生变化,则抛出异常,不再继续执行后续步骤。
以下结合具体场景对本申请实施例的多线程同步方法进行介绍。
以目标锁为锁1为例。例如,对于锁1来说,持锁线程为线程2,线程2请求释放锁1的同时,线程1可以请求获取锁1,其中,线程1为锁1的非持锁线程。在这种情况下,如图16所示,线程1请求获取锁1和线程2请求释放锁1具体包括以下步骤:
步骤1601_1、线程1获取锁1的锁状态变量;步骤1601_2、线程2获取锁1的锁状态变量。
步骤1602_1、线程1检查持锁线程标识域为线程2,检查阻塞线程数域是否为小于第一阈值,若是,则执行步骤1603_1,否则,执行步骤1605_1。
步骤1603_1、线程1进行自旋等待。
步骤1604_1、线程1当自旋等待的次数达到第二阈值时,若检查持锁线程标识域为有效线程且不为第一线程,线程1对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
步骤1605_1、线程1对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
步骤1602_2、线程2检查持锁线程标识域为线程2,检查重复持锁次数域是否为0,若为不为0,则执行步骤1603_2,否则执行步骤1605_2。
步骤1603_2、线程2对重复持锁次数域执行减1操作。
步骤1604_2、线程2重新检查重复持锁次数域是否为0,若是,则执行步骤1605_2,否则线程2继续对锁1持锁。
步骤1605_2、线程2将持锁线程标识域设置为无效线程,以及检查阻塞线程数域是否为0,若是则执行步骤1606_2,否则本流程结束。
步骤1606_2、线程2唤醒针对目标锁处于阻塞状态的至少一个线程。
需要说明的是,步骤1605_2在步骤1602_1中的检查持锁线程标识域为线程2之后执行。
以目标锁为锁1为例。例如,对于锁1来说,持锁线程为线程2,线程2再次请求获取锁1的同时,线程1可以请求获取锁1,其中,线程1为锁1的非持锁线程。在这种情况下,如图17所示,线程1请求获取锁1和线程2再次请求获取锁1具体包括以下步骤:
步骤1701_1、线程1获取锁1的锁状态变量;步骤1701_2、线程2获取锁1的锁状态变量。
步骤1702_1、线程1检查持锁线程标识域为线程2,检查阻塞线程数域是否为小于第一阈值,若是,则执行步骤1703_1,否则,执行步骤1705_1。
步骤1703_1、线程1进行自旋等待。
步骤1704_1、线程1当自旋等待的次数达到第二阈值时,若检查持锁线程标识域为有效线程且不为第一线程,线程1对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
步骤1705_1、线程1对阻塞线程数域执行加1操作,并挂起进入阻塞状态。
步骤1702_2、线程2检查持锁线程标识域为线程2,对重复持锁次数域执行加1操作。
例如,以锁1的锁状态变量如图18所示,阻塞线程数域为N1,重复持锁次数域为N2,第一阈值为L1,第二阈值L2线程2请求释放锁1的同时,线程1可以请求获取锁1不同时间锁状态变量不同域的变化情况可以参见表1、表2和表3所示。为表1描述,将持锁线程标识域简称为域1,将重复持锁标识域简称为域2,将阻塞线程标识域简称为域3。
表1
Figure BDA0002433959180000221
Figure BDA0002433959180000231
表2
Figure BDA0002433959180000232
表3
Figure BDA0002433959180000233
Figure BDA0002433959180000241
需要说明的是,上述是以线程为例对多线程同步方法进行介绍的,当程序执行的最小单位为比线程更小或更大的粒度时,上述涉及到的线程还可以替换为程序执行的最小单位,对此不作限定。
以上各实施例可以单独使用,也可以相互结合使用,以达到不同的技术效果。
上述本申请提供的实施例中,从手机作为执行主体的角度对本申请实施例提供的方法进行了介绍。为了实现上述本申请实施例提供的方法中的各功能,手机可以包括硬件结构和/或软件模块,以软件模块或者硬件结构结合软件模块的形式来实现上述各功能。上述各功能中的某个功能以硬件结构、软件模块、还是硬件结构加软件模块的方式来执行,取决于技术方案的特定应用和设计约束条件。
如图19所示,本申请实施例公开了一种电子设备1900,该电子设备1900可以包括:一个或多个处理器1901和存储器1902。上述各器件可以通过一个或多个通信总线连接。其中该程序指令被存储在上述存储器1902中并被配置为被该一个或多个处理器1901执行,实现本申请实施例图8~图13以及图15~图17所示的多线程同步方法。
上述各个实施例中涉及处理器可以是通用处理器、数字信号处理器(digitalsignal processor,DSP)、专用集成电路(application specific integrated circuit,ASIC)、现成可编程门阵列(field programmable gate array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存取存储器(random access memory,RAM)、闪存、只读存储器(read-only memory,ROM)、可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器,处理器读取存储器中的指令,结合其硬件完成上述方法的步骤。
具体的,上述电子设备1900的具体实现方式可以参见方法部分的相关介绍,在此不再赘述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本申请的保护范围之内,因此本申请的保护范围应以权利要求的保护范围为准。

Claims (28)

1.一种多线程同步方法,其特征在于,所述方法包括:
第一线程请求获取目标锁,包括:
步骤一、所述第一线程获取所述目标锁的锁状态变量,其中,所述锁状态变量包括持锁线程标识域和阻塞线程数域,所述持锁线程标识域用于指示所述目标锁的持锁线程,所述阻塞线程数域用于指示针对所述目标锁处于阻塞状态的线程数;
步骤二、所述第一线程检查所述持锁线程标识域:
步骤三、所述第一线程若检查所述持锁线程标识域为有效线程且不为所述第一线程,所述第一线程检查所述阻塞线程数域;
步骤四、所述第一线程若检查所述阻塞线程数域小于第一阈值,所述第一线程进行自旋等待;
步骤五、所述第一线程当自旋等待的次数达到第二阈值时,若检查所述持锁线程标识域为有效线程且不为所述第一线程,所述第一线程对所述阻塞线程数域执行加1操作,并挂起进入阻塞状态。
2.如权利要求1所述的方法,其特征在于,所述步骤三之后还包括:
步骤六、所述第一线程若检查所述阻塞线程数域大于或等于所述第一阈值,所述第一线程对所述阻塞线程数域执行加1操作,并挂起进入阻塞状态。
3.如权利要求1或2所述的方法,其特征在于,所述锁状态变量还包括重复持锁次数域,所述重复持锁次数域用于指示持锁线程针对所述目标锁的持锁次数。
4.如权利要求3所述的方法,其特征在于,所述步骤二之后还包括:
步骤七、所述第一线程若检查所述持锁线程标识域为所述第一线程,所述第一线程对所述重复持锁次数域执行加1操作。
5.如权利要求3所述的方法,其特征在于,所述步骤二之后还包括:
步骤八、所述第一线程若检查所述持锁线程标识域为无效线程,所述第一线程将所述持锁线程标识域设置为所述第一线程,以及将所述重复持锁次数域设置为初始值。
6.如权利要求3所述的方法,其特征在于,所述方法还包括:
所述第一线程请求释放所述目标锁,包括
步骤九、所述第一线程获取所述目标锁的锁状态变量:
步骤十、所述第一线程检查所述持锁线程标识域;
步骤十一、所述第一线程若检查所述持锁线程标识域为所述第一线程,所述第一线程检查所述重复持锁次数域;
步骤十二、所述第一线程若检查所述重复持锁次数域不为0,所述第一线程对所述重复持锁次数域执行减1操作。
7.如权利要求6所述的方法,其特征在于,所述步骤十二之后还包括:
步骤十三、所述第一线程若检查所述重复持锁次数域为0,所述第一线程将所述持锁线程标识域设置为无效线程;
步骤十四、所述第一线程检查所述阻塞线程数域;
步骤十五、所述第一线程若检查所述阻塞线程数域不为0,所述第一线程唤醒针对所述目标锁处于阻塞状态的至少一个线程。
8.如权利要求3所述的方法,其特征在于,所述方法还包括:
所述第一线程请求中止对所述目标锁持锁,包括:
步骤十六、所述第一线程获取所述目标锁的锁状态变量;
步骤十七、所述第一线程检查所述持锁线程标识域;
步骤十八、所述第一线程若检查所述持锁线程标识域为所述第一线程,第一线程将所述重复持锁次数域保存为所述第一线程针对所述目标锁的上下文;
步骤十九、所述第一线程将所述第一线程的线程标识ID添加到与所述目标锁的ID对应的线程等待列表中;
步骤二十、所述第一线程将所述重复持锁次数域置0,以及将所述持锁线程标识域设置为无效线程,并挂起进入阻塞状态。
9.如权利要求8所述的方法,其特征在于,所述步骤二十之后还包括:
步骤二十一、所述第一线程当被唤醒后,获取所述目标锁的锁状态变量;
步骤二十二、所述第一线程检查所述持锁线程标识域;
步骤二十三、所述第一线程若检查所述持锁线程标识域为无效线程,所述第一线程将所述持锁线程标识域设置为所述第一线程,并根据所述第一线程针对所述目标锁的上下文,设置所述重复持锁次数域;
步骤二十四、所述第一线程删除与所述目标锁的ID对应的线程等待列表中的第一线程的线程ID。
10.如权利要求9所述的方法,其特征在于,所述步骤二十一包括:
所述第一线程当被第二线程唤醒后,获取所述目标锁的锁状态变量,其中,所述第二线程是当与所述目标锁的ID对应的线程等待列表中存储有所述第一线程的线程ID时,唤醒所述第二线程的;所述第二线程与所述第一线程属于同一进程;或者,
所述第一线程当挂起的时长超过第三阈值时被系统唤醒,获取所述目标锁的锁状态变量。
11.如权利要求1至10任一所述的方法,其特征在于,所述阻塞线程数域包括第一值和阻塞线程数高位标识,所述第一值为针对所述目标锁处于阻塞状态的线程数的低位上的值,所述阻塞线程数高位标识用于指示阻塞线程数高位列表中是否存储有与所述目标锁的ID对应的第二值,所述第二值为针对所述目标锁处于阻塞状态的线程数的高位上的值。
12.如权利要求3至10任一所述的方法,其特征在于,所述重复持锁次数域包括第三值和重复持锁次数高位标识,所述第三值为持锁线程针对所述目标锁的持锁次数的低位上的值,所述重复持锁次数高位标识用于指示重复持锁次数高位列表中是否存储有与所述目标锁的ID和持锁线程的线程ID对应的第四值,所述第四值为持锁线程针对所述目标锁的持锁次数的高位上的值。
13.如权利要求1至12任一所述的方法,其特征在于,所述第一线程挂起进入阻塞状态,包括:
所述第一线程进行系统调用,将所述第一线程的状态设置为睡眠态,并将所述第一线程添加到与所述目标锁的地址对应的等待队列中。
14.一种电子设备,其特征在于,所述电子设备包括处理器和存储器,所述存储器存储有程序指令;所述处理器调用所述程序指令,用于第一线程请求获取目标锁;
所述第一线程请求获取目标锁,包括:
步骤一、所述第一线程获取所述目标锁的锁状态变量,其中,所述锁状态变量包括持锁线程标识域和阻塞线程数域,所述持锁线程标识域用于指示所述目标锁的持锁线程,所述阻塞线程数域用于指示针对所述目标锁处于阻塞状态的线程数;
步骤二、所述第一线程检查所述持锁线程标识域:
步骤三、所述第一线程若检查所述持锁线程标识域为有效线程且不为所述第一线程,所述第一线程检查所述阻塞线程数域;
步骤四、所述第一线程若检查所述阻塞线程数域小于第一阈值,所述第一线程进行自旋等待;
步骤五、所述第一线程当自旋等待的次数达到第二阈值时,若检查所述持锁线程标识域为有效线程且不为所述第一线程,所述第一线程对所述阻塞线程数域执行加1操作,并挂起进入阻塞状态。
15.如权利要求14所述的电子设备,其特征在于,所述步骤三之后,还包括:
步骤六、所述第一线程若检查所述阻塞线程数域大于或等于所述第一阈值,所述第一线程对所述阻塞线程数域执行加1操作,并挂起进入阻塞状态。
16.如权利要求14或15所述的电子设备,其特征在于,所述锁状态变量还包括重复持锁次数域,所述重复持锁次数域用于指示持锁线程针对所述目标锁的持锁次数。
17.如权利要求16所述的电子设备,其特征在于,所述步骤二之后还包括:
步骤七、所述第一线程若检查所述持锁线程标识域为所述第一线程,所述第一线程对所述重复持锁次数域执行加1操作。
18.如权利要求16所述的电子设备,其特征在于,所述步骤二之后还包括:
步骤八、所述第一线程若检查所述持锁线程标识域为无效线程,所述第一线程将所述持锁线程标识域设置为所述第一线程,以及将所述重复持锁次数域设置为初始值。
19.如权利要求16所述的电子设备,其特征在于,所述处理器调用所述程序指令,还用于所述第一线程请求释放所述目标锁:
所述第一线程请求释放所述目标锁,包括
步骤九、所述第一线程获取所述目标锁的锁状态变量:
步骤十、所述第一线程检查所述持锁线程标识域;
步骤十一、所述第一线程若检查所述持锁线程标识域为所述第一线程,所述第一线程检查所述重复持锁次数域;
步骤十二、所述第一线程若检查所述重复持锁次数域不为0,所述第一线程对所述重复持锁次数域执行减1操作。
20.如权利要求19所述的电子设备,其特征在于,所述步骤十二之后还包括:
步骤十三、所述第一线程若检查所述重复持锁次数域为0,所述第一线程将所述持锁线程标识域设置为无效线程;
步骤十四、所述第一线程检查所述阻塞线程数域;
步骤十五、所述第一线程若检查所述阻塞线程数域不为0,所述第一线程唤醒针对所述目标锁处于阻塞状态的至少一个线程。
21.如权利要求16所述的电子设备,其特征在于,所述处理器调用所述程序指令,还用于所述第一线程请求中止对所述目标锁持锁:
所述第一线程请求中止对所述目标锁持锁,包括:
步骤十六、所述第一线程获取所述目标锁的锁状态变量;
步骤十七、所述第一线程检查所述持锁线程标识域;
步骤十八、所述第一线程若检查所述持锁线程标识域为所述第一线程,将所述重复持锁次数域保存为所述第一线程针对所述目标锁的上下文;
步骤十九、所述第一线程将所述第一线程的线程标识ID添加到与所述目标锁的ID对应的线程等待列表中;
步骤二十、所述第一线程将所述重复持锁次数域置0,以及将所述持锁线程标识域设置为无效线程,并挂起进入阻塞状态。
22.如权利要求21所述的电子设备,其特征在于,所述步骤二十之后还包括:
步骤二十一、所述第一线程当被唤醒后,获取所述目标锁的锁状态变量;
步骤二十二、所述第一线程检查所述持锁线程标识域;
步骤二十三、所述第一线程若检查所述持锁线程标识域为无效线程,所述第一线程将所述持锁线程标识域设置为所述第一线程,并根据所述第一线程针对所述目标锁的上下文,设置所述重复持锁次数域;
步骤二十四、所述第一线程删除与所述目标锁的ID对应的线程等待列表中的第一线程的线程ID。
23.如权利要求22所述的电子设备,其特征在于,所述步骤二十一包括:
所述第一线程当被第二线程唤醒后,获取所述目标锁的锁状态变量,其中,所述第二线程是当与所述目标锁的ID对应的线程等待列表中存储有所述第一线程的线程ID时,唤醒所述第二线程的;所述第二线程与所述第一线程属于同一进程;或者,
所述第一线程当挂起的时长超过第三阈值时被系统唤醒,获取所述目标锁的锁状态变量。
24.如权利要求14至23任一所述的电子设备,其特征在于,所述阻塞线程数域包括第一值和阻塞线程数高位标识,所述第一值为针对所述目标锁处于阻塞状态的线程数的低位上的值,所述阻塞线程数高位标识用于指示阻塞线程数高位列表中是否存储有与所述目标锁的ID对应的第二值,所述第二值为针对所述目标锁处于阻塞状态的线程数的高位上的值。
25.如权利要求16至24任一所述的电子设备,其特征在于,所述重复持锁次数域包括第三值和重复持锁次数高位标识,所述第三值为持锁线程针对所述目标锁的持锁次数的低位上的值,所述重复持锁次数高位标识用于指示重复持锁次数高位列表中是否存储有与所述目标锁的ID和持锁线程的线程ID对应的第四值,所述第四值为持锁线程针对所述目标锁的持锁次数的高位上的值。
26.如权利要求14至25任一所述的电子设备,其特征在于,所述第一线程挂起进入阻塞状态,包括:
所述第一线程进行系统调用,将所述第一线程的状态设置为睡眠态,并将所述第一线程添加到与所述目标锁的地址对应的等待队列中。
27.一种芯片,其特征在于,所述装置与存储器耦合,使得所述装置在运行时调用所述存储器中存储的程序指令,使得电子设备执行如权利要求1至13任一所述的方法。
28.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质包括程序指令,当所述程序指令在所述电子设备上运行时,使得所述电子设备执行如权利要求1至13任一所述的方法。
CN202010245880.4A 2019-09-25 2020-03-31 一种多线程同步方法及电子设备 Withdrawn CN111552574A (zh)

Priority Applications (3)

Application Number Priority Date Filing Date Title
US17/763,490 US20220350602A1 (en) 2019-09-25 2020-09-21 Multi-Thread Synchronization Method and Electronic Device
PCT/CN2020/116437 WO2021057643A1 (zh) 2019-09-25 2020-09-21 一种多线程同步方法及电子设备
EP20869498.4A EP4020210A4 (en) 2019-09-25 2020-09-21 MULTI-WIRE SYNCHRONIZATION METHOD AND ELECTRONIC DEVICE

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
CN2019109129716 2019-09-25
CN201910912971 2019-09-25

Publications (1)

Publication Number Publication Date
CN111552574A true CN111552574A (zh) 2020-08-18

Family

ID=72007305

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010245880.4A Withdrawn CN111552574A (zh) 2019-09-25 2020-03-31 一种多线程同步方法及电子设备

Country Status (4)

Country Link
US (1) US20220350602A1 (zh)
EP (1) EP4020210A4 (zh)
CN (1) CN111552574A (zh)
WO (1) WO2021057643A1 (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112231131A (zh) * 2020-09-28 2021-01-15 北京金山云网络技术有限公司 一种数据库锁的实现方法、装置、设备及可读存储介质
WO2021057643A1 (zh) * 2019-09-25 2021-04-01 华为技术有限公司 一种多线程同步方法及电子设备
CN113760369A (zh) * 2020-09-29 2021-12-07 北京沃东天骏信息技术有限公司 并发线程处理方法、装置、电子设备以及存储介质
CN116700818A (zh) * 2022-12-05 2023-09-05 荣耀终端有限公司 应用程序运行的方法及电子设备
CN116700817A (zh) * 2022-11-10 2023-09-05 荣耀终端有限公司 应用程序运行的方法及电子设备

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20230056500A1 (en) * 2021-08-18 2023-02-23 Micron Technology, Inc. Chained resource locking
CN115408153B (zh) * 2022-08-26 2023-06-30 海光信息技术股份有限公司 多线程处理器的指令分发方法、装置和存储介质
CN115185718B (zh) * 2022-09-14 2022-11-25 北京云枢创新软件技术有限公司 基于SystemC和C++的多线程数据传输系统
CN116860462B (zh) * 2023-09-04 2023-11-17 奇点数联(北京)科技有限公司 一种基于数仓切片的多线程数据采集方法
CN117271144B (zh) * 2023-11-22 2024-04-23 荣耀终端有限公司 一种线程的处理方法和电子设备

Family Cites Families (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5862376A (en) * 1996-06-24 1999-01-19 Sun Microsystems, Inc. System and method for space and time efficient object locking
US6952827B1 (en) * 1998-11-13 2005-10-04 Cray Inc. User program and operating system interface in a multithreaded environment
US6173442B1 (en) * 1999-02-05 2001-01-09 Sun Microsystems, Inc. Busy-wait-free synchronization
US7058948B2 (en) * 2001-08-10 2006-06-06 Hewlett-Packard Development Company, L.P. Synchronization objects for multi-computer systems
US20040068607A1 (en) * 2002-10-07 2004-04-08 Narad Charles E. Locking memory locations
US20050081204A1 (en) * 2003-09-25 2005-04-14 International Business Machines Corporation Method and system for dynamically bounded spinning threads on a contested mutex
US7823150B2 (en) * 2005-01-25 2010-10-26 International Business Machines Corporation Computer-implemented method, system and program product for establishing multiple read-only locks on a shared data object
US7313673B2 (en) * 2005-06-16 2007-12-25 International Business Machines Corporation Fine grained multi-thread dispatch block mechanism
US8752057B1 (en) * 2008-06-30 2014-06-10 Emc Corporation Techniques for synchronizing processing of at least two code threads
CN102566979B (zh) * 2011-12-02 2014-12-03 华为技术有限公司 实现自适应锁的方法和装置以及多核处理器系统
US10579413B2 (en) * 2013-08-14 2020-03-03 International Business Machines Corporation Efficient task scheduling using a locking mechanism
US9223574B2 (en) * 2014-03-27 2015-12-29 International Business Machines Corporation Start virtual execution instruction for dispatching multiple threads in a computer
US9996402B2 (en) * 2014-04-07 2018-06-12 Oracle International Corporation System and method for implementing scalable adaptive reader-writer locks
US9471400B1 (en) * 2015-07-28 2016-10-18 International Business Machines Corporation Reentrant read-write lock algorithm
US10417056B2 (en) * 2015-08-04 2019-09-17 Oracle International Corporation Systems and methods for performing concurrency restriction and throttling over contended locks
CN105700939B (zh) * 2016-04-21 2019-07-02 北京京东尚科信息技术有限公司 一种分布式系统中多线程同步的方法和系统
US10108453B2 (en) * 2016-06-30 2018-10-23 International Business Machines Corporation Averting lock contention associated with core-based hardware threading in a split core environment
US11226852B2 (en) * 2016-11-25 2022-01-18 Genetec Inc. System for inter-process communication
US10922147B2 (en) * 2018-07-19 2021-02-16 EMC IP Holding Company LLC Storage system destaging based on synchronization object with watermark
CN111552574A (zh) * 2019-09-25 2020-08-18 华为技术有限公司 一种多线程同步方法及电子设备

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2021057643A1 (zh) * 2019-09-25 2021-04-01 华为技术有限公司 一种多线程同步方法及电子设备
CN112231131A (zh) * 2020-09-28 2021-01-15 北京金山云网络技术有限公司 一种数据库锁的实现方法、装置、设备及可读存储介质
CN112231131B (zh) * 2020-09-28 2024-05-28 北京金山云网络技术有限公司 一种数据库锁的实现方法、装置、设备及可读存储介质
CN113760369A (zh) * 2020-09-29 2021-12-07 北京沃东天骏信息技术有限公司 并发线程处理方法、装置、电子设备以及存储介质
CN116700817A (zh) * 2022-11-10 2023-09-05 荣耀终端有限公司 应用程序运行的方法及电子设备
CN116700817B (zh) * 2022-11-10 2024-05-31 荣耀终端有限公司 应用程序运行的方法及电子设备
CN116700818A (zh) * 2022-12-05 2023-09-05 荣耀终端有限公司 应用程序运行的方法及电子设备
CN116700818B (zh) * 2022-12-05 2024-04-12 荣耀终端有限公司 应用程序运行的方法及电子设备

Also Published As

Publication number Publication date
US20220350602A1 (en) 2022-11-03
WO2021057643A1 (zh) 2021-04-01
EP4020210A1 (en) 2022-06-29
EP4020210A4 (en) 2022-09-28

Similar Documents

Publication Publication Date Title
CN111552574A (zh) 一种多线程同步方法及电子设备
WO2021083378A1 (zh) 一种加速应用程序启动的方法及电子设备
EP4002108B1 (en) Application start method and electronic device
WO2021253975A1 (zh) 应用程序的权限管理方法、装置和电子设备
WO2021093626A1 (zh) 一种内存的管理方法及电子设备
WO2021223539A1 (zh) 射频资源分配方法及装置
CN114116191A (zh) 内存冷页的处理方法及电子设备
WO2021218429A1 (zh) 应用窗口的管理方法、终端设备及计算机可读存储介质
CN113806105A (zh) 消息处理方法、装置、电子设备和可读存储介质
WO2021185352A1 (zh) 一种版本升级方法及相关装置
CN114461589B (zh) 读取压缩文件的方法、文件系统及电子设备
WO2023005751A1 (zh) 渲染方法及电子设备
CN111381996B (zh) 内存异常处理方法及装置
CN116315667A (zh) 数据传输方法、装置、设备及存储介质
WO2021190489A1 (zh) 一种显示时间的方法及电子设备
WO2023051094A1 (zh) 内存回收方法、装置、电子设备及可读存储介质
CN118043772A (zh) 绘制方法及电子设备
CN112783418A (zh) 一种存储应用程序数据的方法及移动终端
CN113760191B (zh) 数据读取方法、装置、存储介质和程序产品
WO2021238376A1 (zh) 功能包的加载方法、装置、服务器和电子设备
WO2024093431A1 (zh) 一种图像绘制方法及电子设备
WO2024032430A1 (zh) 管理内存的方法和电子设备
CN116841686B (zh) 一种应用页面的展示方法
CN116541188B (zh) 通知显示方法、终端设备及存储介质
CN117131497B (zh) 一种软件检测方法及电子设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
WW01 Invention patent application withdrawn after publication

Application publication date: 20200818

WW01 Invention patent application withdrawn after publication