CN110888727B - 并发无锁队列实现方法、装置及存储介质 - Google Patents
并发无锁队列实现方法、装置及存储介质 Download PDFInfo
- Publication number
- CN110888727B CN110888727B CN201911174418.3A CN201911174418A CN110888727B CN 110888727 B CN110888727 B CN 110888727B CN 201911174418 A CN201911174418 A CN 201911174418A CN 110888727 B CN110888727 B CN 110888727B
- Authority
- CN
- China
- Prior art keywords
- queues
- thread
- producer
- queue
- threads
- 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
Images
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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开关于一种并发无锁队列实现方法、装置及存储介质,并发无锁队列实现方法适用于多生产者线程多消费者线程模型,多生产者线程多消费者线程模型包括M个生产者线程和N个消费者线程,并发无锁队列实现方法包括:对于M个生产者线程中的任意一个生产者线程,若生产者线程根据其线程局部变量的注册标志确定已注册N个队列,则向N个队列写入数据,其中,N个队列在注册队列时会将队列的持有信息写入生产者线程的线程局部变量,对于N个消费者线程中的任意一个消费者线程,消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从M个无锁队列消费数据,从而降低发生并发访问冲突的概率。
Description
技术领域
本公开涉及数据处理领域,尤其涉及并发无锁队列实现方法、装置及存储介质。
背景技术
在数据处理领域,队列是一种常见的数据结构,队列通常是多个应用模块间保存共享数据的一种方式,典型的队列是先入先出(FirstInputFirstOutput,FIFO)队列,其应用模式通常是一个应用模块把数据保存到队列的一端中(通常可以称这种产生数据的模块为生产者线程),而另一个应用模块在队列的另一端把数据按照先后顺序从队列中取出(通常可以称这种取数据的模块为消费者线程)。
简单的单生产者线程单消费者线程FIFO队列模型中,生产者线程把生产出来的数据存入队列尾中,而消费者线程则从队列头中取出数据,生产者线程和消费者线程各司其职,不存在并发访问,所以没有资源竞争的冲突。而在有多个应用模块同时共享一个队列时,就可能出现以下另外三种情形:多生产者线程单消费者线程、单生产者线程多消费者线程和多生产者线程和多消费者线程。这就导致了可能出现多个生产者线程或者多个消费者线程同时对队列进行访问的情况(通常称为并发访问),这种情况下,如果没有很好的解决并发访问时的冲突问题,就会导致数据错误。在计算机软件领域中,通过采用锁机制来解决并发访问时的冲突问题。锁机制的原理如下:当某个模块要对队列进行访问时,先要取得队列的锁,把队列占为己有,然后才对队列进行相应的读写访问;当队列的锁被某个模块取得时,其它模块无权对队列进行访问。
这种运用锁机制把队列独占的机制,当出现并发冲突时,没有取得队列锁的模块可能需要一直空等待而无法执行其它操作(当其它操作必需要访问队列之后才能执行)。这在单核中央处理器(CentralProcessingUnit,CPU)的系统中,不会存在浪费CPU资源的问题。然而,在多核CPU系统中,假如每个CPU核运行一个单独的应用模块,那么当出现并发访问冲突时,等待获取队列锁的CPU核则会出现空等待而导致CPU资源浪费的情况,进而导致系统效率低下的问题。
发明内容
本公开提供一种并发无锁队列实现方法、装置及存储介质,以至少解决相关技术中在多核CPU系统中,假如每个CPU核运行一个单独的应用模块,那么当出现并发访问冲突时,等待获取队列锁的CPU核则会出现空等待而导致CPU资源浪费的情况,进而导致系统效率低下的问题。本公开的技术方案如下:
根据本公开实施例的第一方面,提供一种并发无锁队列实现方法,所述并发无锁队列实现方法适用于多生产者线程多消费者线程模型,所述多生产者线程多消费者线程模型包括M个生产者线程和N个消费者线程,包括对于所述M个生产者线程中的任意一个生产者线程,若所述生产者线程根据其线程局部变量的注册标志确定已注册N个队列,则向所述N个队列写入数据;其中,所述N个队列在注册队列时会将队列的持有信息写入所述生产者线程的线程局部变量;对于所述N个消费者线程中的任意一个消费者线程,所述消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据。
根据本公开实施例的第二方面,提供一种并发无锁队列实现装置,所述并发无锁队列实现装置适用于多生产者线程多消费者线程模型,所述多生产者线程多消费者线程模型包括M个生产者线程和N个消费者线程,包括数据写入单元,被配置为执行对于所述M个生产者线程中的任意一个生产者线程,若所述生产者线程根据其线程局部变量的注册标志确定已注册N个队列,则向所述N个队列写入数据;其中,所述N个队列在注册队列时会将队列的持有信息写入所述生产者线程的线程局部变量;数据消费单元,被配置为执行对于所述N个消费者线程中的任意一个消费者线程,所述消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据。
根据本公开实施例的第三方面,提供一种存储介质,当所述存储介质中的指令由并发无锁队列实现装置的处理器执行时,使得并发无锁队列实现装置能够执行如第一方面所述的并发无锁队列实现方法。
根据本公开实施例的第四方面,提供一种计算机程序产品,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,当所述计算机程序由计算机程序产品的处理器执行时,使得计算机程序产品能够执行如第一方面所述的并发无锁队列实现方法。
本公开的实施例提供的技术方案至少带来以下有益效果:在多生产者线程多消费者线程模型中,对于M个生产者线程中的任意一个生产者线程,若生产者线程的线程局部变量根据注册标志的状态,确定已注册N个队列,则相当于创建出一个M*N个单生产者线程单消费者线程共享的的无锁队列,从而降低发生并发访问冲突的概率。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理,并不构成对本公开的不当限定。
图1是根据一示例性实施例示出的一种并发无锁队列实现方法的流程图。
图2是根据一示例性实施例示出的一种并发无锁队列实现方法的流程图。
图3是根据一示例性实施例示出的一种并发无锁队列实现装置的框图。
图4是根据一示例性实施例示出的一种并发无锁队列实现装置的框图。
图5是根据一示例性实施例示出的计算机程序产品的内部结构图。
具体实施方式
为了使本领域普通人员更好地理解本公开的技术方案,下面将结合附图,对本公开实施例中的技术方案进行清楚、完整地描述。
需要说明的是,本公开的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本公开的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
图1是根据一示例性实施例示出的一种并发无锁队列实现方法的流程图,如图1所示,并发无锁队列实现方法用于并发无锁队列实现装置中,所述并发无锁队列实现方法适用于多生产者线程多消费者线程模型,所述多生产者线程多消费者线程模型包括M个生产者线程和N个消费者线程,所述并发无锁队列实现方法包括以下步骤。
在步骤S11中,对于所述M个生产者线程中的任意一个生产者线程,若所述生产者线程根据其线程局部变量的注册标志确定已注册N个队列,则向所述N个队列写入数据;其中,所述N个队列在注册队列时会将队列的持有信息写入所述生产者线程的线程局部变量。
在本公开实施例中,对于M个生产者线程中的任意一个生产者线程,若已注册N个队列,会将注册标志的状态置为完成;若未注册N个队列,则注册标志的状态会置为未完成。例如,用1表示注册完成,0表示注册未完成,先初始化所有的队列,将所有的注册标志的状态置为0,对于M个生产者线程中的任意一个生产者线程,若已注册N个队列,会将注册标志的状态置为1。
在本公开实施例中,对于M个生产者线程中的任意一个生产者线程,会先检测注册标志的状态,如果注册标志的状态为1,则表示生产者线程的线程局部变量已注册N个队列。
在本公开实施例中,生产者线程除了在注册队列的同时会将注册标志的状态置为完成,还会在注册队列的同时将队列的持有信息写入生产者线程的线程局部变量,持有信息表示队列的相关信息。
在步骤S12中,对于所述N个消费者线程中的任意一个消费者线程,所述消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据。
其中,M和N为正整数。
在本公开实施例中,在多生产者线程多消费者线程模型中,通常包括两类线程,即若干个生产者线程线程和若干个消费者线程线程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者线程提交的任务,在生产者线程和消费者线程之间通过共享内存缓存区进行通信。
在本公开实施例中,线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。线程局部变量分别为每个线程存储了各自的属性值,并提供给每个线程使用。
在本公开实施例中,对于N个消费者线程中的任意一个消费者线程,消费者线程会先去检查持有信息,如果检查到存在相应的持有信息,则表示该消费者线程持有M个无锁队列,接下来以轮询的形式从所述M个无锁队列消费数据。
在本公开实施例中,N个消费者线程可以预先创建也支持动态创建。对于M个生产者线程中的任意一个生产者线程X,生产者线程X的线程局部变量已注册N个队列,则相当于创建出一个M*N个单生产者线程单消费者线程共享的的无锁队列,向每个生产者线程的N个队列写入数据,则表示向M*N个单生产者线程单消费者线程共享的的无锁队列写入数据。之后,N个消费者线程中的任意一个消费者线程,消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从M个无锁队列消费数据,相当于单个消费者线程从M*N个单生产者线程单消费者线程共享的的无锁队列中消费数据,任何一个队列不存在多个生产者线程或者多个消费者线程共同访问,不存在多核CPU下的争抢,不会发生性能蜕化,更容易线性扩展。
可选的,在一示例性实施例中,对于所述N个消费者线程中的任意一个消费者线程,以批量消费的形式从所述M个无锁队列的每个队列消费数据。
在本公开实施例中,批量消费表示数据消费多条数据,从而可以减少队列间切换的开销。
可选的,在一示例性实施例中,所述N个队列中的每个队列配置有队列序号;则步骤S11中的向所述N个队列写入数据包括:
根据所述队列序号向对应的队列写入数据。
在本公开实施例中,对于M个生产者线程中的任意一个生产者线程X,生产者线程X的线程局部变量根据注册标志的状态,确定已注册N个队列,初始化所有的队列,N个队列中的每个队列配置有队列序号,假设获取到当前待写入的队列序号为1,则向队列序号为1的队列写入数据。
可选的,在向队列序号为1的队列写入数据后,对队列序号1进行标注,表示其对应的队列以写入数据,继续获取下一个待写入的队列序号,直至完成所有数据的写入。
可选的,在一示例性实施例中,步骤S11中的向所述N个队列写入数据包括:
以轮询的形式向所述N个队列写入数据。
在本公开实施例中,对于M个生产者线程中的任意一个生产者线程X,生产者线程X的线程局部变量根据注册标志的状态,确定已注册N个队列,生产者线程X以轮询的形式向对应的N个队列写入数据。
图2是根据一示例性实施例示出的一种并发无锁队列实现方法的流程图,如图2所示,并发无锁队列实现方法用于并发无锁队列实现装置中,所述并发无锁队列实现方法适用于多生产者线程多消费者线程模型,所述多生产者线程多消费者线程模型包括M个生产者线程和N个消费者线程,所述并发无锁队列实现方法包括以下步骤。
在步骤S21中,对于所述M个生产者线程中的任意一个生产者线程,若生产者线程的线程局部变量根据注册标志的状态,确定未注册N个队列,对于所述M个生产者线程中的任意一个生产者线程,获取互斥锁,依次注册N个队列,其中,在注册队列的同时会将队列的持有信息写入所述生产者线程的线程局部变量。
其中,在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为"互斥锁"的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
在步骤S22中,完成所述M个生产者线程中的每个生产者线程的N个队列的注册,将注册标志的状态置为完成,并向所述N个队列写入数据。
在步骤S23中,对于所述N个消费者线程中的任意一个消费者线程,消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据;其中,M和N为正整数。
在本公开实施例中,N个消费者线程可以预先创建也支持动态创建。对于M个生产者线程中的任意一个生产者线程,以单个生产者线程X的注册为例,首先根据注册标志的状态检查生产者线程X的线程局部变量否已注册好对应的N个队列,如果已经注册好,则后续方案如图1所示的实施例中所述方案中描述的内容。若生产者线程的线程局部变量根据注册标志的状态,确定未注册N个队列,则该生产者线程去获取互斥锁,在获取到互斥锁的情况下,依次注册N个队列。其中,该注册数据,对于生产者线程一方保存在生产者线程对应的线程局部变量里,对于消费者线程一方则保存在消费者线程持有的普通内存数据结构里。
在本公开实施例中,根据上述对生产者线程X的N个队列的注册过程,完成对M个生产者线程中的每个生产者线程的N个队列的注册,相当于创建出一个M*N个单生产者线程单消费者线程共享的的无锁队列,向每个生产者线程的N个队列写入数据,则表示向M*N个单生产者线程单消费者线程共享的的无锁队列写入数据。其中,在注册队列的同时会将队列的持有信息写入生产者线程的线程局部变量,之后,N个消费者线程中的任意一个消费者线程,消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从M个无锁队列消费数据,相当于单个消费者线程从M*N个单生产者线程单消费者线程共享的的无锁队列中消费数据,任何一个队列不存在多个生产者线程或者多个消费者线程共同访问,不存在多核CPU下的争抢,不会发生性能蜕化,更容易线性扩展。此外,对于向队列中写入数据和消费数据,因每个队列某时刻只会有一个生产者线程和一个消费者线程访问,仅需简单的内存屏障来保证头尾指针的数据同步,无需任何锁结构,也无需CAS原语。
其中,M*N个单生产者线程单消费者线程共享的的无锁队列的销毁均由对应消费者线程来完成。
其中,对于M个生产者线程中的任意一个生产者线程,获取互斥锁,依次注册N个队列后,将N个队列的持有信息放在本生产者线程的线程局部变量里,并将注册标志置为完成,同时N个消费者线程也分别持有一个对应的队列。
其中,根据以上的注册过程描述,同样支持M个生产者线程和N个消费者线程的交叉动态创建,具体不再赘述。
可选的,在一示例性实施例中,所述M个生产者线程中的任意一个生产者线程根据原子变量记录或更新对应的生产者线程的队列的数量和序号。
在本发明实施例中,原子变量提供对单个变量的原子操作。当操作一个普通变量时,实现的每个操作,在程序编译时会被转换成几个机器能读懂的指令。例如,当分配一个值给变量,在Java只使用了一个指令,但是当编译这个程序时,这个指令就被转换成多个JVM语言指令。这样在操作多个线程且共享一个变量时,就会导致数据不一致的错误。为了避免这样的问题,Java引入了原子变量。当一个线程正在操作一个原子变量时,即使其他线程也想要操作这个变量,类的实现中含有一个检查那步骤操作是否完成的机制。
可选的,在一示例性实施例中,所述N个消费者线程中的任意一个消费者线程根据原子变量记录或更新对应的消费者线程的队列的数量和序号。
在本公开实施例中,生产者线程根据原子变量记录或更新对应的生产者线程的队列的数量和序号,消费者线程根据原子变量记录或更新对应的消费者线程的队列的数量和序号,从而保证访问时不会丢失队列。
可选的,在一示例性实施例中,储存数据的缓冲区采用数组结构。
在本公开实施例中,采用数组结构存储数据,数组结构相比链表结构对数据的缓冲存储更友好。此外,采用数组结构从本质上避免了无锁技术中的ABA问题,数组在访问过程中对应内存一直重用,消费时不进行内存释放,因此不存在内存回收和复用带来的ABA问题。
可选的,在一示例性实施例中,数组的头尾指针使用padding属性。
在本公开实施例中,对于数组的头尾指针使用padding属性,避免头尾指针频繁访问造成的缓存行污染伪共享问题。
图3是根据一示例性实施例示出的一种并发无锁队列实现装置框图。参照图3,该装置包括数据写入单元31和数据消费单元32。
该数据写入单元31被配置为执行对于所述M个生产者线程中的任意一个生产者线程,若生产者线程的线程局部变量根据注册标志的状态,确定已注册N个队列,则向所述N个队列写入数据,其中,在注册队列的同时会将队列的持有信息写入所述生产者线程的线程局部变量。
该数据消费单元32被配置为执行对于所述N个消费者线程中的任意一个消费者线程,消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据;其中,M和N为正整数。
可选的,在一示例性实施例中,对于所述N个消费者线程中的任意一个消费者线程,以批量消费的形式从所述M个无锁队列的每个队列消费数据。
可选的,在一示例性实施例中,所述N个队列中的每个队列配置有队列序号;该数据写入单元31被配置为根据所述队列序号向对应的队列写入数据。
可选的,在一示例性实施例中,该数据写入单元31被配置为以轮询的形式向所述N个队列写入数据。
图4是根据一示例性实施例示出的一种并发无锁队列实现装置框图。参照图4,该装置包括注册单元33,数据写入单元31和数据消费单元32。
该注册单元33,被配置为执行对于所述M个生产者线程中的任意一个生产者线程,若生产者线程的线程局部变量根据注册标志的状态,确定未注册N个队列,获取互斥锁,依次注册N个队列,其中,在注册队列的同时会将队列的持有信息写入所述生产者线程的线程局部变量。
该数据写入单元31,被配置为执行完成所述M个生产者线程中的每个生产者线程的N个队列的注册,将注册标志的状态置为完成,并向所述N个队列写入数据。
该数据消费单元32被配置为执行对于所述N个消费者线程中的任意一个消费者线程,消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据;其中,M和N为正整数。
可选的,在一示例性实施例中,所述M个生产者线程中的任意一个生产者线程根据原子变量记录或更新对应的生产者线程的队列的数量和序号。
可选的,在一示例性实施例中,所述N个消费者线程中的任意一个消费者线程根据原子变量记录或更新对应的消费者线程的队列的数量和序号。
可选的,在一示例性实施例中,储存数据的缓冲区采用数组结构。
关于上述实施例中的装置,其中各个单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
在示例性实施例中,还提供了一种包括指令的存储介质,例如包括指令的存储器,其中,本公开所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
在一个实施例中,提供了一种计算机程序产品,该计算机程序产品可以是服务器,其内部结构图可以如图5所示。该计算机程序产品包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机程序产品的处理器用于提供计算和控制能力。该计算机程序产品的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机程序产品的数据库用于存储数据。该计算机程序产品的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种并发无锁队列实现方法。
本领域技术人员可以理解,图5中示出的结构,仅仅是与本公开方案相关的部分结构的框图,并不构成对本公开方案所应用于其上的计算机程序产品的限定,具体的计算机程序产品可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本公开的其它实施方案。本公开旨在涵盖本公开的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本公开的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本公开的真正范围和精神由下面的权利要求指出。
应当理解的是,本公开并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本公开的范围仅由所附的权利要求来限制。
Claims (17)
1.一种并发无锁队列实现方法,所述并发无锁队列实现方法适用于多生产者线程多消费者线程模型,所述多生产者线程多消费者线程模型包括M个生产者线程和N个消费者线程,其特征在于,包括:
对于所述M个生产者线程中的任意一个生产者线程,检测注册标志的状态,若所述生产者线程根据其线程局部变量的所述注册标志的状态确定已注册N个队列,则向所述N个队列写入数据;其中,所述N个队列在注册队列时会将队列的持有信息写入所述生产者线程的线程局部变量,所述持有信息表示所述队列的相关信息;
对于所述N个消费者线程中的任意一个消费者线程,所述消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据。
2.根据权利要求1所述的并发无锁队列实现方法,其特征在于,对于所述N个消费者线程中的任意一个消费者线程,以批量消费的形式从所述M个无锁队列的每个队列消费数据。
3.根据权利要求1所述的并发无锁队列实现方法,其特征在于,所述N个队列中的每个队列配置有队列序号;
所述向所述N个队列写入数据,包括:
根据所述队列序号向对应的队列写入数据。
4.根据权利要求1所述的并发无锁队列实现方法,其特征在于,所述向所述N个队列写入数据,包括:
以轮询的形式向所述N个队列写入数据。
5.根据权利要求1所述的并发无锁队列实现方法,其特征在于,对于所述M个生产者线程中的任意一个生产者线程,若生产者线程的线程局部变量根据注册标志的状态,确定未注册N个队列,所述方法还包括:
对于所述M个生产者线程中的任意一个生产者线程,获取互斥锁,依次注册N个队列;其中,在注册队列的同时会将队列的持有信息写入所述生产者线程的线程局部变量;
完成所述M个生产者线程中的每个生产者线程的N个队列的注册,将注册标志的状态置为完成,并向所述N个队列写入数据。
6.根据权利要求1所述的并发无锁队列实现方法,其特征在于,所述M个生产者线程中的任意一个生产者线程根据原子变量记录或更新对应的生产者线程的队列的数量和序号。
7.根据权利要求1所述的并发无锁队列实现方法,其特征在于,所述N个消费者线程中的任意一个消费者线程根据原子变量记录或更新对应的消费者线程的队列的数量和序号。
8.根据权利要求1所述的并发无锁队列实现方法,其特征在于,储存数据的缓冲区采用数组结构。
9.一种并发无锁队列实现装置,所述并发无锁队列实现装置适用于多生产者线程多消费者线程模型,所述多生产者线程多消费者线程模型包括M个生产者线程和N个消费者线程,其特征在于,包括:
数据写入单元,被配置为执行对于所述M个生产者线程中的任意一个生产者线程,检测注册标志的状态,若所述生产者线程根据其线程局部变量的所述注册标志的状态确定已注册N个队列,则向所述N个队列写入数据;其中,所述N个队列在注册队列时会将队列的持有信息写入所述生产者线程的线程局部变量,所述持有信息表示所述队列的相关信息;
数据消费单元,被配置为执行对于所述N个消费者线程中的任意一个消费者线程,所述消费者线程根据队列的持有信息,确定持有M个无锁队列,以轮询的形式从所述M个无锁队列消费数据。
10.根据权利要求9所述的并发无锁队列实现装置,其特征在于,对于所述N个消费者线程中的任意一个消费者线程,以批量消费的形式从所述M个无锁队列的每个队列消费数据。
11.根据权利要求9所述的并发无锁队列实现装置,其特征在于,所述N个队列中的每个队列配置有队列序号;
所述数据写入单元,还被配置为执行根据所述队列序号向对应的队列写入数据。
12.根据权利要求9所述的并发无锁队列实现装置,其特征在于,所述数据写入单元,还被配置为执行以轮询的形式向所述N个队列写入数据。
13.根据权利要求9所述的并发无锁队列实现装置,其特征在于,对于所述M个生产者线程中的任意一个生产者线程,若生产者线程的线程局部变量根据注册标志的状态,确定未注册N个队列,所述并发无锁队列实现装置还包括注册单元;
所述注册单元,被配置为执行对于所述M个生产者线程中的任意一个生产者线程,获取互斥锁,依次注册N个队列;其中,在注册队列的同时会将队列的持有信息写入所述生产者线程的线程局部变量;
所述数据写入单元,还被配置为执行完成所述M个生产者线程中的每个生产者线程的N个队列的注册,将注册标志的状态置为完成,并向所述N个队列写入数据。
14.根据权利要求9所述的并发无锁队列实现装置,其特征在于,所述M个生产者线程中的任意一个生产者线程根据原子变量记录或更新对应的生产者线程的队列的数量和序号。
15.根据权利要求9所述的并发无锁队列实现装置,其特征在于,所述N个消费者线程中的任意一个消费者线程根据原子变量记录或更新对应的消费者线程的队列的数量和序号。
16.根据权利要求9所述的并发无锁队列实现装置,其特征在于,储存数据的缓冲区采用数组结构。
17.一种存储介质,当所述存储介质中的指令由并发无锁队列实现装置的处理器执行时,使得并发无锁队列实现装置能够执行如权利要求1至8中任一项所述的并发无锁队列实现方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911174418.3A CN110888727B (zh) | 2019-11-26 | 2019-11-26 | 并发无锁队列实现方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911174418.3A CN110888727B (zh) | 2019-11-26 | 2019-11-26 | 并发无锁队列实现方法、装置及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110888727A CN110888727A (zh) | 2020-03-17 |
CN110888727B true CN110888727B (zh) | 2022-07-22 |
Family
ID=69748869
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911174418.3A Active CN110888727B (zh) | 2019-11-26 | 2019-11-26 | 并发无锁队列实现方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110888727B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111208985B (zh) * | 2020-04-21 | 2020-07-28 | 南京云信达科技有限公司 | 基于生产者消费者模型的数据处理方法、系统及存储介质 |
CN111767154B (zh) * | 2020-06-19 | 2024-06-25 | 北京思特奇信息技术股份有限公司 | 用于无阻塞通讯的无锁环形队列实现方法 |
CN112131002B (zh) * | 2020-09-24 | 2023-10-13 | 腾讯科技(深圳)有限公司 | 数据管理方法及装置 |
CN112527844A (zh) * | 2020-12-22 | 2021-03-19 | 北京明朝万达科技股份有限公司 | 数据处理方法及装置、数据库架构 |
CN113176896B (zh) * | 2021-03-19 | 2022-12-13 | 中盈优创资讯科技有限公司 | 一种基于单进单出无锁队列的随机取出对象的方法 |
CN113051057A (zh) * | 2021-03-30 | 2021-06-29 | 联想(北京)有限公司 | 多线程数据无锁处理方法、装置及电子设备 |
CN113672406B (zh) * | 2021-08-24 | 2024-02-06 | 北京天融信网络安全技术有限公司 | 数据传输处理方法、装置、电子设备及存储介质 |
CN113672400A (zh) * | 2021-08-26 | 2021-11-19 | 深信服科技股份有限公司 | 一种数据处理方法、装置、设备及可读存储介质 |
CN113742092A (zh) * | 2021-09-09 | 2021-12-03 | 李永进 | 一种并发算法 |
CN116069526B (zh) * | 2023-02-08 | 2023-12-05 | 北京基调网络股份有限公司 | 一种基于无锁消息池的数据存取方法和计算机设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9697044B2 (en) * | 2013-05-21 | 2017-07-04 | Nvidia Corporation | Application programming interface to enable the construction of pipeline parallel programs |
CN108762682A (zh) * | 2018-05-31 | 2018-11-06 | 郑州云海信息技术有限公司 | 一种线程模型 |
CN109739654A (zh) * | 2018-08-10 | 2019-05-10 | 比亚迪股份有限公司 | 消息中间件及消息传输方法 |
CN110134439A (zh) * | 2019-03-30 | 2019-08-16 | 北京百卓网络技术有限公司 | 无锁化的数据结构构建方法和写入数据、读取数据的方法 |
Family Cites Families (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8595729B2 (en) * | 2006-11-06 | 2013-11-26 | Intel Corporation | Managing sequenced lock requests |
US9424080B2 (en) * | 2014-09-30 | 2016-08-23 | Oracle International Corporation | Systems and methods for utilizing futures for constructing scalable shared data structures |
CN107515795A (zh) * | 2017-09-08 | 2017-12-26 | 北京京东尚科信息技术有限公司 | 基于队列的多任务并行数据处理方法、装置、介质和设备 |
CN109656691A (zh) * | 2017-10-11 | 2019-04-19 | 阿里巴巴集团控股有限公司 | 计算资源的处理方法、装置以及电子设备 |
CN108363625B (zh) * | 2018-02-12 | 2022-04-19 | 聚好看科技股份有限公司 | 一种无锁线程有序控制存储信息的方法、装置和服务器 |
CN109684091B (zh) * | 2018-12-24 | 2021-04-27 | 杭州迪普科技股份有限公司 | 一种任务处理方法及装置 |
-
2019
- 2019-11-26 CN CN201911174418.3A patent/CN110888727B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9697044B2 (en) * | 2013-05-21 | 2017-07-04 | Nvidia Corporation | Application programming interface to enable the construction of pipeline parallel programs |
CN108762682A (zh) * | 2018-05-31 | 2018-11-06 | 郑州云海信息技术有限公司 | 一种线程模型 |
CN109739654A (zh) * | 2018-08-10 | 2019-05-10 | 比亚迪股份有限公司 | 消息中间件及消息传输方法 |
CN110134439A (zh) * | 2019-03-30 | 2019-08-16 | 北京百卓网络技术有限公司 | 无锁化的数据结构构建方法和写入数据、读取数据的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110888727A (zh) | 2020-03-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110888727B (zh) | 并发无锁队列实现方法、装置及存储介质 | |
US8095727B2 (en) | Multi-reader, multi-writer lock-free ring buffer | |
US8473950B2 (en) | Parallel nested transactions | |
US8868848B2 (en) | Sharing virtual memory-based multi-version data between the heterogenous processors of a computer platform | |
US8495641B2 (en) | Efficiently boosting priority of read-copy update readers while resolving races with exiting and unlocking processes | |
US8924655B2 (en) | In-kernel SRCU implementation with reduced OS jitter | |
US9218305B2 (en) | Reader-writer synchronization with high-performance readers and low-latency writers | |
CN110727675B (zh) | 一种链表的处理方法及装置 | |
US8244682B2 (en) | Saving snapshot of a knowledge base without blocking | |
US9207967B2 (en) | Using nonspeculative operations for lock elision | |
US11269692B2 (en) | Efficient sequencer for multiple concurrently-executing threads of execution | |
US20210303551A1 (en) | State-based queue protocol | |
US10313477B2 (en) | System and method for use of a non-blocking process with a resource pool in a computing environment | |
CN111459691A (zh) | 共享内存的读写方法及装置 | |
CN112181748A (zh) | 基于环形队列的并发测试方法、装置、设备及存储介质 | |
CN115686881A (zh) | 数据处理方法、装置和计算机设备 | |
US7752399B2 (en) | Exclusion control method and information processing apparatus | |
US20120059997A1 (en) | Apparatus and method for detecting data race | |
JP4734348B2 (ja) | 共有メモリ型マルチプロセッサにおける非同期遠隔手続き呼び出し方法、非同期遠隔手続き呼び出しプログラムおよび記録媒体 | |
US20140157279A1 (en) | Information processing apparatus, information processing system, information processing method and control program storage medium | |
CN114625546A (zh) | 一种数据处理方法及装置 | |
CN111695314A (zh) | 一种多核芯片仿真测试方法及装置 | |
US7447875B1 (en) | Method and system for management of global queues utilizing a locked state | |
Antoniadis et al. | Sequential proximity: towards provably scalable concurrent search algorithms | |
CN118260051A (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |