CN115202884B - 基于轮询的高性能***的加解读写锁的方法及应用 - Google Patents
基于轮询的高性能***的加解读写锁的方法及应用 Download PDFInfo
- Publication number
- CN115202884B CN115202884B CN202210895195.5A CN202210895195A CN115202884B CN 115202884 B CN115202884 B CN 115202884B CN 202210895195 A CN202210895195 A CN 202210895195A CN 115202884 B CN115202884 B CN 115202884B
- Authority
- CN
- China
- Prior art keywords
- lock
- working thread
- variable
- threads
- read
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/505—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the load
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4812—Task transfer initiation or dispatching by interrupt, e.g. masked
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/5038—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multi Processors (AREA)
Abstract
本发明公开了一种基于轮询的高性能***的加解读写锁的方法及应用,该方法包括以下步骤:在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为0;若是,所述工作线程不存在加写锁的请求,所述工作线程加读锁成功,并将所述工作线程中的已加读锁数量加1;若否,所述工作线程存在加写锁的请求,等待所述工作线程解写锁。该方法能够通过按CPU一对一工作线程维护本地数据结构,不需要使用互斥锁,加解读锁时完全访问该CPU工作线程只修改本地数据结构,加解写锁通过线程中的变量以及消息传递广播写来交换写信息,以达到完全没有睡眠且读只访问本地变量的高性能读写锁语义,适合读多写少场景。
Description
技术领域
本发明是关于计算机领域,特别是关于一种基于轮询的高性能***的加解读写锁的方法及应用。
背景技术
传统的并发模型通常是基于线程池,这种模型下多个线程需要访问共享资源时需要通用锁来保护共享资源并发访问,当锁发生冲突时,线程需要睡眠,进而等待排队获取锁。传统做法是维护一个全局数据结构,用于描述当前已经加上或者等待加锁的信息,这个全局数据结构由于每次加锁,多个线程并发访问,通常会用一个互斥锁来保护,解锁时通过一个信号量来唤醒,当多个线程同时加读锁时,需要首先争抢互斥锁以访问全局数据结构,会导致线程睡眠。但在基于轮询的高性能并发模型下,线程睡眠会极大的影响性能。
公开于该背景技术部分的信息仅仅旨在增加对本发明的总体背景的理解,而不应当被视为承认或以任何形式暗示该信息构成已为本领域一般技术人员所公知的现有技术。
发明内容
本发明的目的在于提供一种基于轮询的高性能***的加解读写锁的方法及应用,解决现有技术中当多个线程同时加读锁时,首先需要争抢互斥锁以访问全局数据结构,进而导致线程睡眠的问题。
为实现上述目的,本发明的实施例提供了一种基于轮询的高性能***的加解读写锁的方法。
在本发明的一个或多个实施方式中,所述方法包括:在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为0;若是,所述工作线程不存在加写锁的请求,所述工作线程加读锁成功,并将所述工作线程中的已加读锁数量加1;若否,所述工作线程存在加写锁的请求,等待所述工作线程解写锁。
在本发明的一个或多个实施方式中,所述方法还包括:在解读锁时,将所述工作线程中的已加读锁数量减1;判断所述工作线程中的已加读锁数量是否为0,且所述工作线程中的第一变量是否不为0;若是,向所述工作线程中的第一变量对应的请求加写锁的CPU发送允许加写锁消息。
为实现上述目的,本发明的实施例还提供了一种基于轮询的高性能***的加解读写锁的方法。
在本发明的一个或多个实施方式中,所述方法包括:在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值;若是,将所述工作线程的原子变量设置为第二值,并通过发送消息将所有线程的第一变量设置为所述工作线程的编号;判断所述工作线程中的第二变量是否等于所有线程数量,其中,所述第二变量表示已收到允许加写锁的线程数量;若是,所述工作线程加写锁成功。
在本发明的一个或多个实施方式中,所述通过发送消息将所有线程的第一变量设置为所述工作线程的编号,包括:将所述工作线程中的第一变量设置为所述工作线程的编号,并发送请求加写锁消息给其他线程;以及将所述其它线程中的第一变量设置为所述工作线程的编号。
在本发明的一个或多个实施方式中,所述方法还包括:判断所述其他线程的已加读锁数量是否为0;若是,将所述工作线程中的第二变量加1;若否,等待所述其他线程解读锁。
在本发明的一个或多个实施方式中,所述方法还包括:在解写锁时,将所述工作线程中的第一变量和第二变量均设置为0,并向所述其它线程发送请求解写锁消息将所述其它线程中的第一变量设置为0,并将所述原子变量设为第一值,触发对应线程的加写锁重试或加读锁重试。
在本发明的另一个方面当中,提供了一种基于轮询的高性能***的加解读写锁的装置,其包括判断模块、加读锁模块和等待模块。
判断模块,用于在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为第一值。
加读锁模块,用于供所述工作线程不存在加写锁的请求,所述工作线程加读锁成功,并将所述工作线程中的已加读锁数量加1。
等待模块,用于供所述工作线程存在加写锁的请求,等待所述工作线程解写锁。
在本发明的一个或多个实施方式中,所述装置还包括:解读锁模块,用于在解读锁时,将所述工作线程中的已加读锁数量减1;判断所述工作线程中的已加读锁数量是否为0,且所述工作线程中的第一变量是否不为0;若是,向所述工作线程中的第一变量对应的请求加写锁的CPU发送允许加写锁消息。
在本发明的另一个方面当中,提供了一种基于轮询的高性能***的加解读写锁的装置,其包括判断模块和加写锁模块。
判断模块,用于在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值。
加写锁模块,用于将所述工作线程的原子变量设置为第二值,并通过发送消息将所有线程的第一变量设置为所述工作线程的编号;判断所述工作线程中的第二变量是否等于所有线程数量,其中,所述第二变量表示已收到允许加写锁的线程数量;若是,所述工作线程加写锁成功。
在本发明的一个或多个实施方式中,所述加写锁模块还用于:将所述工作线程中的第一变量设置为所述工作线程的编号,并发送请求加写锁消息给其他线程;以及将所述其它线程中的第一变量设置为所述工作线程的编号。
在本发明的一个或多个实施方式中,所述加写锁模块还用于:判断所述其他线程的已加读锁数量是否为0;若是,将所述工作线程中的第二变量加1;若否,等待所述其他线程解读锁。
在本发明的一个或多个实施方式中,所述装置还包括:解写锁模块,用于在解写锁时,将所述工作线程中的第一变量和第二变量均设置为0,并向所述其它线程发送请求解写锁消息将所述其它线程中的第一变量设置为0,并将所述原子变量设为第一值,触发对应线程的加写锁重试或加读锁重试。
在本发明的另一个方面当中,提供了一种电子设备,包括:至少一个处理器;以及存储器,所述存储器存储指令,当所述指令被所述至少一个处理器执行时,使得所述至少一个处理器执行如上所述的基于轮询的高性能***的加解读写锁的方法。
在本发明的另一个方面当中,提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如所述的基于轮询的高性能***的加解读写锁的方法的步骤。
与现有技术相比,根据本发明实施方式的基于轮询的高性能***的加解读写锁的方法及应用,其能够通过按CPU一对一工作线程维护本地数据结构,不需要使用互斥锁,加解读锁时完全访问该CPU工作线程只修改本地数据结构,加解写锁通过线程中的变量以及消息传递广播写来交换写信息,以达到完全没有睡眠且读只访问本地变量的高性能读写锁语义,适合读多写少场景。
附图说明
图1是根据本发明一实施方式的基于轮询的高性能***的加读锁的方法的流程图;
图2是根据本发明一实施方式的基于轮询的高性能***的加读锁的方法的具体流程图;
图3是根据本发明一实施方式的基于轮询的高性能***的加解读锁的方法的流程图;
图4是根据本发明一实施方式的基于轮询的高性能***的加解读锁的方法的具体流程图;
图5是根据本发明一实施方式的基于轮询的高性能***的加写锁的方法的流程图;
图6是根据本发明一实施方式的基于轮询的高性能***的加写锁的方法的具体流程图;
图7是根据本发明一实施方式的基于轮询的高性能***的加解写锁的方法的流程图;
图8是根据本发明一实施方式的基于轮询的高性能***的加解写锁的方法的具体流程图;
图9是根据本发明一实施方式的基于轮询的高性能***的加解读锁的装置的结构图;
图10是根据本发明一实施方式的基于轮询的高性能***的加解写锁的装置的结构图;
图11是根据本发明一实施方式的基于轮询的高性能***的加解读写锁的计算设备的硬件结构图。
具体实施方式
下面结合附图,对本发明的具体实施方式进行详细描述,但应当理解本发明的保护范围并不受具体实施方式的限制。
除非另有其它明确表示,否则在整个说明书和权利要求书中,术语“包括”或其变换如“包含”或“包括有”等等将被理解为包括所陈述的元件或组成部分,而并未排除其它元件或其它组成部分。
以下结合附图,详细说明本发明各实施例提供的技术方案。
实施例1
如图1至图2所示,介绍本发明的一个实施例中基于轮询的高性能***的加解读写锁的方法,该方法包括如下步骤。
在步骤S101中,在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为0。
在本实施例中,按照CPU一对一工作线程的方式维护本地数据结构,假设当前存在CPU 1-CPU N,则对应的工作线程描述为T1-T N,每个线程T拥有4个变量用来维护本地数据结构,即已加读锁的数量R,原子变量W0,第一变量W1和第二变量W2。R表示该工作线程当前已加读锁的数量。原子变量W0用于判断所有工作线程中是否存在线程等待加写锁,在原子变量W0为1时,表示已有线程等待加写锁,在原子变量W0为0时,表示没有线程存在加写锁等待,该工作线程此时可以开始加写锁。第一变量W1为0时表示当前没有请求加写锁的线程,第一变量W1不为0表示当前请求加写锁的CPU编号。第二变量W2表示该工作线程已收到的允许写的线程数量。在初始状态下,每个工作线程的4个变量均为0。
在加读锁时,CPU通过对应的工作线程中的第一变量可以判断当前是否存在请求加写锁的线程,加解写锁和加解读锁是不可以同时进行的,当前存在加写锁的线程时,无法加读锁,此时等待接收正在加写锁线程解写锁的消息,重新加读锁。
在步骤S102中,工作线程不存在加写锁的请求,工作线程加读锁成功,并将工作线程中的已加读锁数量加1。
在第一变量W1等于0时,代表当前不存在加写锁的请求,不存在互斥行为,可以加读锁。由于此时加读锁成功,该工作线程对应的已加读锁的数量R也应对应加1。
在步骤S103中,工作线程存在加写锁的请求,等待工作线程解写锁。
在第一变量W1不等于0时,代表当前存在加写锁的请求,加锁失败,此时等待接收正在加写锁线程解写锁的消息,重新加读锁。
在本实施例中,CPU仅控制对应的工作线程的变量,进而控制线程加读锁,加读锁时完全访问该CPU工作线程只修改本地数据结构,在多个线程同时加读锁时,无需争抢互斥锁以访问全局数据结构,因此避免了线程睡眠带来的性能下降。
实施例2
如图3至图4所示,介绍本发明的一个实施例中基于轮询的高性能***的加解读写锁的方法,该方法包括如下步骤。
在步骤S201中,在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为0。
在本实施例中,按照CPU一对一工作线程的方式维护本地数据结构,假设当前存在CPU 1-CPU N,则对应的工作线程描述为T1-T N,每个线程T拥有4个变量用来维护本地数据结构,即已加读锁的数量R,原子变量W0,第一变量W1和第二变量W2。R表示该工作线程当前已加读锁的数量。原子变量W0用于判断所有工作线程中是否存在线程等待加写锁,在原子变量W0为1时,表示已有线程等待加写锁,在原子变量W0为0时,表示没有线程存在加写锁等待,该工作线程此时可以开始加写锁。第一变量W1为0时表示当前没有请求加写锁的线程,第一变量W1不为0表示当前请求加写锁的CPU编号。第二变量W2表示该工作线程已收到的允许写的线程数量。在初始状态下,每个工作线程的4个变量均为0。
在加读锁时,CPU通过对应的工作线程中的第一变量可以判断当前是否存在请求加写锁的线程,加解写锁和加解读锁是不可以同时进行的,当前存在加写锁的线程时,无法加读锁,此时等待接收正在加写锁线程解写锁的消息,重新加读锁。
在步骤S202中,工作线程不存在加写锁的请求,工作线程加读锁成功,并将工作线程中的已加读锁数量加1。
在第一变量W1等于0时,代表当前不存在加写锁的请求,不存在互斥行为,可以加读锁。由于此时加读锁成功,该工作线程对应的已加读锁的数量R也应对应加1。
在步骤S203中,工作线程存在加写锁的请求,等待工作线程解写锁。
在第一变量W1不等于0时,代表当前存在加写锁的请求,加锁失败,此时等待接收正在加写锁线程解写锁的消息,重新加读锁。
在步骤S204中,在解读锁时,判断工作线程中的已加读锁数量是否为0,且工作线程中的第一变量是否不为0,向工作线程中的第一变量对应的请求加写锁的CPU发送允许加写锁消息。
在解读锁时,首先将工作线程中的已加读锁数量减1,再判断工作线程中的已加读锁数量是否为0,且工作线程中的第一变量是否不为0。在工作线程中的已加读锁数量是否为0,且工作线程中的第一变量是否不为0时,代表该工作线程已不存在加读锁,且存在请求加写锁的线程。由于工作线程中的已加读锁数量为0不存在加读锁影响加写锁,此时可以向请求加写锁的线程发送允许其开始加写锁的消息。
举例来说,CPU 1-CPU N对设备发起IO读请求前,CPU通过对应的工作线程中的第一变量可以判断当前是否存在请求加写锁的线程,若不存在加读锁,访问设备健康状态数据结构,如果设备健康执行IO操作,如果设备故障返回IO失败,完成IO操作后,将工作线程的已加读锁数量减1以实现解读锁。
实施例3
如图5至图6所示,介绍本发明的一个实施例中基于轮询的高性能***的加解读写锁的方法,该方法包括如下步骤。
在步骤S301中,在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值。
在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值,在本实施例中,原子变量第一值为0,原子变量第二值为1。在当前CPU对应的工作线程的原子变量为零时,代表当前没有等待加写锁的线程,该工作线程可以加写锁,将该工作线程的原子变量设置为1。
在步骤S302中,将工作线程的原子变量设置为第二值,并通过发送消息将所有线程的第一变量设置为工作线程的编号。
假设该工作线程为T1且T1的原子变量为1,则表示此时只有工作线程T1发起加写锁请求,将工作线程T1的第一变量W1设置当前工作线程的编号(即1),并发送工作线程T1发起加写锁请求消息给其他线程。
其他线程收到消息后将各自的第一变量均设置为工作线程T1的编号1,并检查各自的已加读锁数量R是否等于0,若是,则回复给工作线程T1消息允许其加写锁,并将工作线程T1的第二变量W2加1。如果其他线程的已加读锁数量R不等于0,则需要等待读锁解锁发送消息给工作线程T1后才可以加写锁。
在步骤S303中,判断工作线程中的第二变量是否等于所有线程数量,其中,第二变量表示已收到允许加写锁的线程数量。
当工作线程T1收到所有线程允许写操作时(即工作线程T1的第二变量W2等于N),则加写锁成功。
在步骤S304中,工作线程加写锁成功。
在本实施例中,加解写锁通过工作线程中的4个变量以及消息传递广播写来交换写信息,以达到完全没有睡眠且读只访问本地变量的高性能读多写少锁语义,适合读多写少场景。
实施例4
如图7至图8所示,介绍本发明的一个实施例中基于轮询的高性能***的加解读写锁的方法,该方法包括如下步骤。
在步骤S401中,在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值。
在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值,在本实施例中,原子变量第一值为0,原子变量第二值为1。在当前CPU对应的工作线程的原子变量为零时,代表当前没有等待加写锁的线程,该工作线程可以加写锁,将该工作线程的原子变量设置为1。
在步骤S402中,将工作线程的原子变量设置为第二值,并通过发送消息将所有线程的第一变量设置为工作线程的编号。
假设该工作线程为T1且T1的原子变量为1,则表示此时只有工作线程T1发起加写锁请求,将工作线程T1的第一变量W1设置当前工作线程的编号(即1),并发送工作线程T1发起加写锁请求消息给其他线程。
其他线程收到消息后将各自的第一变量均设置为工作线程T1的编号1,并检查各自的已加读锁数量R是否等于0,若是,则回复给工作线程T1消息允许其加写锁,并将工作线程T1的第二变量W2加1。如果其他线程的已加读锁数量R不等于0,则需要等待读锁解锁发送消息给工作线程T1后才可以加写锁。
在步骤S403中,判断工作线程中的第二变量是否等于所有线程数量,其中,第二变量表示已收到允许加写锁的线程数量。
当工作线程T1收到所有线程允许写操作时(即工作线程T1的第二变量W2等于N),则加写锁成功。
在步骤S404中,工作线程加写锁成功。
在步骤S405中,在解写锁时,将工作线程中的第一变量和第二变量均设置为0,并向其它线程发送请求解写锁消息。
在写解锁时,工作线程T1的第二变量W2设置为0,将工作线程T1的第一变量W1设置为0,并向所有其它线程发送请求解写锁的消息,将其它线程第一变量W1设置为0并触发对应线程的加写锁重试或者加读锁重试。
如图9所示,介绍根据本发明具体实施方式的基于轮询的高性能***的加解读写锁的装置。
在本发明的实施方式中,基于轮询的高性能***的加解读写锁的装置包括判断模块901、加读锁模块902、等待模块903和解读锁模块904。
判断模块901,用于在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为第一值。
加读锁模块902,用于供工作线程不存在加写锁的请求,工作线程加读锁成功,并将工作线程中的已加读锁数量加1。
等待模块903,用于供工作线程存在加写锁的请求,等待工作线程解写锁。
解读锁模块904,用于在解读锁时,将工作线程中的已加读锁数量减1;判断工作线程中的已加读锁数量是否为0,且工作线程中的第一变量是否不为0;若是,向工作线程中的第一变量对应的请求加写锁的CPU发送允许加写锁消息。
如图10所示,介绍根据本发明具体实施方式的基于轮询的高性能***的加解读写锁的装置。
在本发明的实施方式中,基于轮询的高性能***的加解读写锁的装置包括判断模块1001、加写锁模块1002和解写锁模块1003。
判断模块1001,用于在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值。
加写锁模块1002,用于将工作线程的原子变量设置为第二值,并通过发送消息将所有线程的第一变量设置为工作线程的编号;判断工作线程中的第二变量是否等于所有线程数量,其中,第二变量表示已收到允许加写锁的线程数量;若是,工作线程加写锁成功。
加写锁模块1002还用于:将工作线程中的第一变量设置为工作线程的编号,并发送请求加写锁消息给其他线程;以及将其它线程中的第一变量设置为工作线程的编号。
加写锁模块1002还用于:判断其他线程的已加读锁数量是否为0;若是,将工作线程中的第二变量加1;若否,等待其他线程解读锁。
解写锁模块1003,用于在解写锁时,将工作线程中的第一变量和第二变量均设置为0,并向其它线程发送请求解写锁消息将其它线程中的第一变量设置为0,并将原子变量设为第一值,触发对应线程的加写锁重试或加读锁重试。
图11示出了根据本说明书的实施例的用于基于轮询的高性能***的加解读写锁的计算设备110的硬件结构图。如图11所示,计算设备110可以包括至少一个处理器1101、存储器1102(例如非易失性存储器)、内存1103和通信接口1104,并且至少一个处理器1101、存储器1102、内存1103和通信接口1104经由总线1105连接在一起。至少一个处理器1101执行在存储器1102中存储或编码的至少一个计算机可读指令。
应该理解,在存储器1102中存储的计算机可执行指令当执行时使得至少一个处理器1101进行本说明书的各个实施例中以上结合图1-11描述的各种操作和功能。
在本说明书的实施例中,计算设备110可以包括但不限于:个人计算机、服务器计算机、工作站、桌面型计算机、膝上型计算机、笔记本计算机、移动计算设备、智能电话、平板计算机、蜂窝电话、个人数字助理(PDA)、手持装置、消息收发设备、可佩戴计算设备、消费电子设备等等。
根据一个实施例,提供了一种比如机器可读介质的程序产品。机器可读介质可以具有指令(即,上述以软件形式实现的元素),该指令当被机器执行时,使得机器执行本说明书的各个实施例中以上结合图1-11描述的各种操作和功能。具体地,可以提供配有可读存储介质的***或者装置,在该可读存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该***或者装置的计算机或处理器读出并执行存储在该可读存储介质中的指令。
根据本发明实施方式的基于轮询的高性能***的加解读写锁的方法及应用,其能够通过按CPU一对一工作线程维护本地数据结构,不需要使用互斥锁,加解读锁时完全访问该CPU工作线程只修改本地数据结构,加解写锁通过线程中的变量以及消息传递广播写来交换写信息,以达到完全没有睡眠且读只访问本地变量的高性能读写锁语义,适合读多写少场景。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
前述对本发明的具体示例性实施方案的描述是为了说明和例证的目的。这些描述并非想将本发明限定为所公开的精确形式,并且很显然,根据上述教导,可以进行很多改变和变化。对示例性实施例进行选择和描述的目的在于解释本发明的特定原理及其实际应用,从而使得本领域的技术人员能够实现并利用本发明的各种不同的示例性实施方案以及各种不同的选择和改变。本发明的范围意在由权利要求书及其等同形式所限定。
Claims (7)
1.一种基于轮询的高性能***的加解写锁的方法,其特征在于,所述方法包括:
在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值,其中,所述原子变量用于判断所有线程中是否存在线程等待加写锁;若是,
将所述工作线程的原子变量设置为第二值,并通过发送消息将所有线程的第一变量设置为所述工作线程的编号;
将所述工作线程中的第一变量设置为所述工作线程的编号,并发送请求加写锁消息给其他线程;
将所述其他线程中的第一变量设置为所述工作线程的编号,判断所述其他线程的已加读锁数量是否为0;
若是,将所述工作线程中的第二变量加1,其中,所述第二变量表示已收到允许加写锁的线程数量;
若否,等待所述其他线程解读锁;
判断所述工作线程中的第二变量是否等于所有线程数量;若是,
所述工作线程加写锁成功。
2.如权利要求1所述的基于轮询的高性能***的加解写锁的方法,其特征在于,所述方法还包括:
在解写锁时,将所述工作线程中的第一变量和第二变量均设置为0,并向所述其他线程发送请求解写锁消息将所述其他线程中的第一变量设置为0,并将所述原子变量设为第一值,触发对应线程的加写锁重试或加读锁重试。
3.一种基于轮询的高性能***的加解读锁的方法,与权利要求1所述的基于轮询的高性能***的加解写锁的方法相对应,其特征在于,所述方法包括:
在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为0;若是,
所述工作线程不存在加写锁的请求,所述工作线程加读锁成功,并将所述工作线程中的已加读锁数量加1;若否,
所述工作线程存在加写锁的请求,等待所述工作线程解写锁;以及,
在解读锁时,将所述工作线程中的已加读锁数量减1;
判断所述工作线程中的已加读锁数量是否为0,且所述工作线程中的第一变量是否不为0;若是,
向所述工作线程中的第一变量对应的请求加写锁的CPU发送允许加写锁消息。
4. 一种基于轮询的高性能***的加解写锁的装置,其特征在于,所述装置包括:
判断模块,用于在加写锁时,判断当前CPU对应的工作线程的原子变量是否为第一值,其中,所述原子变量用于判断所有线程中是否存在线程等待加写锁;以及
加写锁模块,用于将所述工作线程的原子变量设置为第二值,并通过发送消息将所有线程的第一变量设置为所述工作线程的编号;将所述工作线程中的第一变量设置为所述工作线程的编号,并发送请求加写锁消息给其他线程;将所述其他线程中的第一变量设置为所述工作线程的编号,判断所述其他线程的已加读锁数量是否为0;若是,将所述工作线程中的第二变量加1,其中,所述第二变量表示已收到允许加写锁的线程数量;若否,等待所述其他线程解读锁;判断所述工作线程中的第二变量是否等于所有线程数量;若是,所述工作线程加写锁成功。
5.一种基于轮询的高性能***的加解读锁的装置,与权利要求4所述的基于轮询的高性能***的加解写锁的装置相对应,其特征在于,所述装置包括:
判断模块,用于在加读锁时,判断当前CPU对应的工作线程中的第一变量是否为0;
加读锁模块,用于供所述工作线程不存在加写锁的请求,所述工作线程加读锁成功,并将所述工作线程中的已加读锁数量加1;
解读锁模块,用于将所述工作线程中的已加读锁数量减1;判断所述工作线程中的已加读锁数量是否为0,且所述工作线程中的第一变量是否不为0;向所述工作线程中的第一变量对应的请求加写锁的CPU发送允许加写锁消息;
等待模块,用于供所述工作线程存在加写锁的请求,等待所述工作线程解写锁。
6.一种电子设备,其特征在于,包括:
至少一个处理器;以及
存储器,所述存储器存储指令,当所述指令被所述至少一个处理器执行时,使得所述至少一个处理器执行如权利要求1至2中任一项所述的基于轮询的高性能***的加解写锁的方法或权利要求3所述的基于轮询的高性能***的加解读锁的方法。
7.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1至2任一项所述的基于轮询的高性能***的加解写锁的方法或权利要求3所述的基于轮询的高性能***的加解读锁的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210895195.5A CN115202884B (zh) | 2022-07-26 | 2022-07-26 | 基于轮询的高性能***的加解读写锁的方法及应用 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210895195.5A CN115202884B (zh) | 2022-07-26 | 2022-07-26 | 基于轮询的高性能***的加解读写锁的方法及应用 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115202884A CN115202884A (zh) | 2022-10-18 |
CN115202884B true CN115202884B (zh) | 2023-08-22 |
Family
ID=83583849
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210895195.5A Active CN115202884B (zh) | 2022-07-26 | 2022-07-26 | 基于轮询的高性能***的加解读写锁的方法及应用 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115202884B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6029190A (en) * | 1997-09-24 | 2000-02-22 | Sony Corporation | Read lock and write lock management system based upon mutex and semaphore availability |
CN102999378A (zh) * | 2012-12-03 | 2013-03-27 | 中国科学院软件研究所 | 一种读写锁实现方法 |
CN106325980A (zh) * | 2015-06-30 | 2017-01-11 | 中国石油化工股份有限公司 | 一种多线程并发*** |
CN111880940A (zh) * | 2020-07-29 | 2020-11-03 | 北京浪潮数据技术有限公司 | 一种存储***中数据处理方法、装置、设备及存储介质 |
CN113791916A (zh) * | 2021-11-17 | 2021-12-14 | 支付宝(杭州)信息技术有限公司 | 对象更新、读取方法及装置 |
CN113835901A (zh) * | 2013-10-15 | 2021-12-24 | 北京奥星贝斯科技有限公司 | 读锁操作方法、写锁操作方法及*** |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8099538B2 (en) * | 2006-03-29 | 2012-01-17 | Intel Corporation | Increasing functionality of a reader-writer lock |
US8539168B2 (en) * | 2009-06-26 | 2013-09-17 | Oracle America, Inc. | Concurrency control using slotted read-write locks |
US9684614B2 (en) * | 2014-01-27 | 2017-06-20 | Signalchip Innovations Private Limited | System and method to convert lock-free algorithms to wait-free using a hardware accelerator |
US10585874B2 (en) * | 2016-04-25 | 2020-03-10 | International Business Machines Corporation | Locking concurrent commands in a database management system |
CN108572876B (zh) * | 2018-03-07 | 2020-11-20 | 北京神州绿盟信息安全科技股份有限公司 | 一种读写锁的实现方法及装置 |
-
2022
- 2022-07-26 CN CN202210895195.5A patent/CN115202884B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6029190A (en) * | 1997-09-24 | 2000-02-22 | Sony Corporation | Read lock and write lock management system based upon mutex and semaphore availability |
CN102999378A (zh) * | 2012-12-03 | 2013-03-27 | 中国科学院软件研究所 | 一种读写锁实现方法 |
CN113835901A (zh) * | 2013-10-15 | 2021-12-24 | 北京奥星贝斯科技有限公司 | 读锁操作方法、写锁操作方法及*** |
CN106325980A (zh) * | 2015-06-30 | 2017-01-11 | 中国石油化工股份有限公司 | 一种多线程并发*** |
CN111880940A (zh) * | 2020-07-29 | 2020-11-03 | 北京浪潮数据技术有限公司 | 一种存储***中数据处理方法、装置、设备及存储介质 |
CN113791916A (zh) * | 2021-11-17 | 2021-12-14 | 支付宝(杭州)信息技术有限公司 | 对象更新、读取方法及装置 |
Non-Patent Citations (1)
Title |
---|
TLRW: return of the read-write lock;Dave Dice等;《Proceedings of the twenty-second annual ACM symposium on Parallelism in algorithms and architectures》;284-293 * |
Also Published As
Publication number | Publication date |
---|---|
CN115202884A (zh) | 2022-10-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109271258B (zh) | 读写锁重入的实现方法、装置、终端及存储介质 | |
CN102262559B (zh) | 一种资源共享的方法及*** | |
CN110597640A (zh) | 进程间的数据传输方法、装置、终端及计算机存储介质 | |
US20140089346A1 (en) | Methods and apparatus for implementing semi-distributed lock management | |
US9690737B2 (en) | Systems and methods for controlling access to a shared data structure with reader-writer locks using multiple sub-locks | |
CN103248667B (zh) | 一种分布式***的资源访问方法和*** | |
CN110188110B (zh) | 一种构建分布式锁的方法及装置 | |
EP3230860B1 (en) | Technologies for efficient synchronization barriers with work stealing support | |
CN112416556B (zh) | 一种数据读写优先平衡方法、***、装置及存储介质 | |
CN115686881A (zh) | 数据处理方法、装置和计算机设备 | |
CN111984379B (zh) | 读写事务控制方法、***、终端设备及存储介质 | |
EP4044058A1 (en) | Capability management method and computer device | |
CN114356215A (zh) | 一种分布式集群及分布式集群锁的控制方法 | |
CN115202884B (zh) | 基于轮询的高性能***的加解读写锁的方法及应用 | |
EP3249540B1 (en) | Method for writing multiple copies into storage device, and storage device | |
CN111124622A (zh) | 一种多线程访问临界资源的方法、存储介质及智能终端 | |
CN112346879B (zh) | 进程管理方法、装置、计算机设备及存储介质 | |
US20080082533A1 (en) | Persistent locks/resources for concurrency control | |
US9418175B2 (en) | Enumeration of a concurrent data structure | |
CN115033394A (zh) | 一种多核mcu访问共享外设的控制***及相关设备 | |
CN113961364A (zh) | 一种大规模锁***实现方法、装置、存储介质和服务器 | |
CN105264494B (zh) | 鉴权处理装置和方法 | |
CN111522764A (zh) | 插拔操作的处理方法、终端及存储介质 | |
CN111930527A (zh) | 一种多核异构平台维护cache一致性的方法 | |
US10331498B1 (en) | ColoredLock synchronization object, allowing flow specific policy of lock canceling |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |