CN114595044A - 一种基于自定义条件队列的多线程处理数据的方法及系统 - Google Patents
一种基于自定义条件队列的多线程处理数据的方法及系统 Download PDFInfo
- Publication number
- CN114595044A CN114595044A CN202210164004.8A CN202210164004A CN114595044A CN 114595044 A CN114595044 A CN 114595044A CN 202210164004 A CN202210164004 A CN 202210164004A CN 114595044 A CN114595044 A CN 114595044A
- Authority
- CN
- China
- Prior art keywords
- queue
- thread
- processing
- sub
- processed
- 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.)
- Pending
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
-
- 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
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/48—Indexing scheme relating to G06F9/48
- G06F2209/484—Precedence
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5018—Thread 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)
- Multi Processors (AREA)
Abstract
本发明提供了一种基于自定义条件队列的多线程处理数据的方法及系统,方法包括创建数据处理类对象,对可创建的最大子线程数量进行初始化设置,根据可创建的最大子线程数量创建自定义双端条件队列,主线程调用数据处理类对象处理数据,逐一分解出待处理项,主线程封装待处理项后投递队列,并分配处理的子线程,子线程从双端条件队列获取一个元素,子线程根据元素的任务类型对元素内的数据进行处理。本发明提供的方法提升了系统资源的利用率,提升了系统处理各类数据的扩展性,避免了多线程争抢共享数据的可能,省去了引入锁机制同步数据产生的时间消耗,提升了子线程的利用率及程序处理性能。
Description
技术领域
本发明属于技术领域,具体涉及一种基于自定义条件队列的多线程处理数据的方法及系统。
背景技术
应用软件被要求有更高的处理性能。为了提升应用软件的处理性能,可以在程序设计时采用并行技术,或是从硬件层面配置更多的CPU和更多的内存,但硬件层面的提升往往需要投入更大的采购成本,而软件层面应用并行处理技术的提升,则相对更为廉价,往往是首选方案。
广义的并行,即要求一个程序在同一时刻同时处理多个任务。为了提升程序的处理性能,常常采用多进程或多线程这两种并行处理技术。多进程相对多线程而言,具有进程间资源相互隔离,编程简单且可靠性高的优势,但是也存在占用内存较多,CPU利用率较低的缺点。
因此,多进程技术适用于弱相关的多任务并行处理,并不适用于需要消耗很多CPU进行大量计算的应用场景。多线程技术因为数据共享简单、占用内存少、CPU利用率高等特点,广泛应用于数据处理领域。
但对于数据计算和数据分析业务,比如芯片测试行业中调制特性的计算或信令数据合成,如果利用传统的多线程处理技术,往往需要引入互斥锁、读写锁、自旋锁或信号量等来解决多线程间资源争抢或数据同步的问题,一不小心还可能引入死锁的bug。
另外,目前软件开发中大部分多线程处理数据的方法,局限于将一个大任务分解成若干个同质子任务进行并行处理,而对异质子任务的并行处理束手无策,即只能提升部分数据的处理性能。一旦各类子任务的数量不均衡,就会出现有的队列任务很快被处理完成,线程白白空跑,占用系统资源,有的队列任务积压,线程忙不过来的场景,最终导致程序的处理性能不稳定。
出现上述情况时,虽然可以通过结合业务数据分析的方式进行补救,但需要为那些数量大或处理耗时的子任务类型创建更多的处理队列来均衡负载,为此也需要额外创建更多的处理线程。这种事后补救方式,CPU有效利用率不高,实现复杂而不通用;一旦业务发生变化,各类子任务的数量也发生变化,显得捉襟见肘。
发明内容
为了克服上述现有技术的缺陷,本发明提出了一种基于自定义条件队列的多线程处理数据的方法,所述方法包括:
创建数据处理类对象,对可创建的最大子线程数量进行初始化设置;
根据所述可创建的最大子线程数量创建自定义双端条件队列;
主线程调用所述数据处理类对象处理数据,逐一分解出待处理项;
所述主线程封装待处理项后投递队列,并分配处理的子线程;
所述子线程从双端条件队列获取一个元素;
所述子线程根据元素的任务类型对元素内的数据进行处理。
具体地,所述“创建数据处理类对象,对可创建的最大子线程数量进行初始化设置”包括:
创建所述数据处理类对象;
获取系统的中央处理器核心数,根据所述中央处理器核心数,确定可创建子线程的最大值;
根据所述可创建子线程的最大值,创建自定义双端条件队列数组。
具体地,所述“主线程调用所述数据处理类对象处理数据,逐一分解出待处理项”包括:
所述主线程调用所述数据处理类对象处理数据;
判断能否从所述数据中分解出一个待处理项;
若能够从所述数据中分解出一个所述待处理项,将该待处理项封装为待处理子单元,投递所述待处理子单元,并分配处理的子线程;
若不能从所述数据中分解出一个所述待处理项,判断是否需要等待所有所述队列元素处理完成;
若需要等待所有所述队列元素处理完成,判断各个所述队列是否为空;
若各个所述队列不为空,轮询均衡所述队列负载;
若各个所述队列为空,判断各个所述队列的线程是否空闲;
若各个所述队列的线程不为空闲,重复判断各个所述队列的线程是否空闲。
具体地,所述“所述主线程封装待处理项后投递队列,并分配处理的子线程”包括:
设置用于遍历队列的队列编号为0;
根据所述队列编号获取所述队列元素个数;
判断所述队列元素个数是否大于0;
若所述队列元素个数大于0,保存队列元素最少的所述队列编号;
所述队列编号值加1;
判断所述队列编号是否等于所述队列总数;
若所述队列编号等于所述队列总数,将该待处理子单元压入元素最少的所述队列,若判断结果为否,重复所述“根据队列编号获取队列元素个数”的步骤。
进一步地,还包括:
若所述队列元素个数不大于0,判断线程池中是否有该队列编号的处理线程;
若所述线程池中没有该队列编号的处理线程,为所述队列创建处理子线程,并为线程处理函数指定所述队列编号,将所述队列的所述处理子线程纳入所述线程池,根据所述队列编号,将该待处理子单元压入对应的所述队列并唤醒处理线程;
若所述线程池中有该队列编号的处理线程,判断所述队列处理线程是否空闲;
若所述队列处理线程空闲,根据所述队列编号,将该待处理子单元压入对应的所述队列并唤醒处理线程;
若所述队列处理线程不为空闲,执行所述“保存队列元素最少的所述队列编号”的步骤。
进一步地,所述“轮询均衡所述队列负载”包括:
获取所述线程池中子线程个数;
设置用于遍历队列的队列编号为0,将循环计数值设置为1;
根据所述队列编号查询所述队列元素个数是否大于1;
若所述队列元素个数不大于1,记录该空队列编号,所述队列编号加1;
若所述队列元素个数大于1,判断是否有空队列编号;
若有空队列编号,从所述队列中移出一个待调整元素,从所述空队列编号记录中移出一个空队列编号,根据所述空队列编号把待调整元素压入所述空队列并唤醒处理线程,所述队列编号加1;
若没有空队列编号,所述队列编号加1;
所述队列编号加1后,判断所述队列编号是否等于所述线程池子线程个数;
若所述队列编号不等于所述线程池子线程个数,执行所述“根据所述队列编号查询所述队列元素个数是否大于1”的步骤;
若所述队列编号等于所述线程池子线程个数,判断所述循环计数值是否大于1;
若所述循环计数值不大于1,循环计数值加1,并置队列编号为0,执行所述“根据所述队列编号查询所述队列元素个数是否大于1”的步骤。
进一步地,所述“主线程调用所述数据处理类对象处理数据,逐一分解出待处理项”还包括:
子线程根据所述队列编号访问所述队列;
获取一个所述“投递所述待处理子单元,并分配处理的子线程”步骤通过唤醒处理线程,执行所述“所述子线程从双端条件队列获取一个元素”,得到的所述队列元素;
判断数据是否有效;
若所述数据有效,根据从队列里获取的待处理子单元的任务类型,调用相应的处理函数,进行业务相关的数据计算和存储,并重复执行所述“子线程根据所述队列编号访问所述队列”的步骤。
具体地,所述“所述子线程从双端条件队列获取一个元素”包括:
尝试从所述队列中获取一个元素;
判断所述队列是否为空;
若所述队列不为空,移出一个队列元素;
若所述队列为空,判断是否程序要求停止;
若所述程序不要求停止,所述队列进入等待状态,直至所述主线程把新的待处理子单元压入所述队列,并唤醒处理线程。
进一步地,所述“所述子线程根据元素的任务类型对元素内的数据进行处理”包括:
判断所述待处理子单元的任务类型;
根据所述待处理子单元的任务类型,选择相应的处理函数。
本发明还提出了一种基于自定义条件队列的多线程处理数据的系统,所述系统用于实现如前文所述的基于自定义条件队列的多线程处理数据的方法。
本发明至少具有以下有益效果:
在线程空闲时释放CPU资源和锁资源的占用,提升了系统资源的利用率,避免了多线程争抢共享数据的可能,省去了引入锁机制同步数据产生的时间消耗,提升了子线程的利用率及程序处理性能;
进一步地,本发明支持自由投递队列,提升了软件架构的稳定性、通用性和灵活性,实现了运行状态下的动态负载均衡。
以此,本发明提供了一种基于自定义条件队列的多线程处理数据的方法及系统,用于提升多线程处理数据的性能,本发明提供的方法提升了系统资源的利用率,提升了系统处理各类数据的扩展性,避免了多线程争抢共享数据的可能,省去了引入锁机制同步数据产生的时间消耗,实现了运行状态下的动态负载均衡,提升了软件架构的稳定性、通用性和灵活性。
附图说明
为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明提供的一种基于自定义条件队列的多线程处理数据的方法的流程示意图;
图2为数据处理类对象的创建及初始化流程示意图;
图3为队列和线程间的结构关系示意图;
图4为投递待处理子单元的流程示意图;
图5为对待处理子单元进行处理的流程示意图;
图6为智能化投递并分配处理的子线程的流程示意图;
图7为轮询均衡队列负载的流程示意图;
图8为子线程从双端条件队列获取一个元素的流程示意图;
图9为子线程根据元素的任务类型对元素内的数据进行处理的流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供一种基于自定义条件队列的多线程处理数据的方法,本发明提供的方法创建线程合理,资源有效利用率高,使用锁少或不使用锁,并且较为灵活通用。
请参考图1,所述方法包括:
S100:创建数据处理类对象,对可创建的最大子线程数量进行初始化设置,进入步骤S200。
本发明提出的方法根据处理器的中央处理器核数来创建及初始化数据处理类对象,决定了创建线程数量的上限,避免因创建线程过多浪费内存和中央处理器频繁切换浪费时间。
通过为每个子线程分配专属队列,避免了多线程争抢共享数据的可能,省去了引入锁机制同步数据产生的时间消耗。
S200:根据可创建的最大子线程数量创建自定义双端条件队列,进入步骤S300。
本实施例中使用了自定义双端条件队列,在其它实施例中,可使用双端条件队列,当队列为空时,通过yield函数释放中央处理器占用。
为每个子线程分配专属队列,可以保证各个子线程处理数据的过程相互独立,避免了子线程间对共享数据的争抢,即省去了为解决共享数据访问冲突引入互斥锁而导致的时间消耗,主线程、子线程和队列间的访问关系请参考图2。
S300:主线程调用数据处理类对象处理数据,逐一分解出待处理项。
本发明在处理数据时,支持根据业务需要逐一分解出待处理项,待处理项可以是各类待处理子数据块,也可以是各类待处理子任务。待处理项经过去差异化封装成为待处理子单元,所述待处理子单元内部包含源数据指针,处理类型及一些其他字段。
统一格式的待处理子单元可投递各个线程的专属队列,不会因为业务差异而有投递限制,即不会因为各类业务数据量发生变化而需要调整程序的整体架构,只需要在子线程的处理函数中根据队列元素类型区分处理即可,即使需要新增业务数据类型的处理,基本上也只需要在子线程的处理函数内添加新处理类型的相关逻辑即可。
对待处理子单元,采取实时分解实时智能化投递队列的方式,以求实时触发子线程处理队列元素,让子线程尽快的工作起来。
在完成所有待处理子单元的投递后,主线程可以直接返回,也可以等所有队列元素处理完成再返回。针对需要等所有队列元素处理完成才返回的情况,主线程会对各个子线程的专属队列进行轮询,当发现即有空闲队列又有积压队列的场景时,会利用专属队列是双端条件队列的特性进行负载均衡。
S400:主线程封装待处理项后投递队列,并分配处理的子线程。
具体地,在投递待处理子单元时,主线程会根据队列积压情况做智能化投递并适时创建子线程,尽量保证各个队列的负载均衡。
如果主线程在完成待处理子单元的投递后立即返回,则队列的负载均衡由后续请求的待处理子单元智能化投递来实现;如果主线程在完成待处理子单元的投递后,要等待所有队列元素处理完成才返回,则主线程会定时轮询各个子线程的专属队列的负载。
主线程通过一次轮询遍历两轮子线程的专属队列,把积压队列的元素移到空队列处理,动态均衡负载,实现空闲子线程的再利用,提升系统的整体性能。
S500:子线程从双端条件队列获取一个元素。
子线程的专属队列是基于条件变量构造的自定义双端条件队列,所述自定义双端条件队列以类模板形式存在,支持通过自定义类型实例化队列,通过主线程的队列轮询机制和双端队列特性,实现了运行状态下的动态负载均衡,提升了程序处理性能。
在子线程处理完专属队列内的元素后,队列会进入等待状态,让渡中央处理器资源和锁资源,直到主线程把新的待处理子单元压入队列,并唤醒处理线程,子线程才重新获得中央处理器资源,并从队列获取一个元素。
S600:子线程根据元素的任务类型对元素内的数据进行处理。
主线程在数据处理时,把多个待处理项封装成了统一格式的待处理子单元。子线程在处理队列元素时,根据不同的处理类型,进行针对性处理,是队列负载均衡的基础。
具体地,请参考图3,步骤S100包括:
S110:创建数据处理类对象,进入步骤S120。
S120:获取系统的中央处理器核心数,确定可创建子线程的最大值,进入步骤S130。
具体地,所述中央处理器核心数为mCoreNum,所述可创建子线程的最大值mThNum=mCoreNum-1;若为超线程情况,则所述可创建子线程的最大值mThNum=2*mCoreNum-1。
S130:根据可创建子线程的最大值,创建自定义双端条件队列数组。
具体地,所述自定义双端条件队列数组的元素个数mQueNum=mThNum。
具体地,请参考图4,步骤S300包括:
S310:开始,进入步骤S311。
S311:主线程调用数据处理类对象处理数据,进入步骤S312。
S312:判断能否从数据中分解出一个待处理项。
若能够从数据中分解出一个待处理项,进入步骤S320;若不能从数据中分解出一个待处理项,进入步骤S330。
S320:将该待处理项封装为待处理子单元,进入步骤S321。
所述待处理子单元内部包含任务类型,序号等。
S321:投递待处理子单元,并分配处理的子线程,转至步骤S312。
需要说明的是,步骤S321等同于步骤400。
S330:判断是否需要等待所有队列元素处理完成。
若判断结果为是,进入步骤S340;若判断结果为否,进入步骤S360。
S340:判断各个队列是否为空。
若判断结果为是,进入步骤S350;若判断结果为否,进入步骤S341。
S341:轮询均衡队列负载,重复步骤S340。
S350:判断各个队列的线程是否空闲。
若判断结果为是,进入步骤S360;若判断结果为否,重复步骤S350。
S360:结束。
进一步地,请参考图5,步骤S300还包括:
S370:开始,进入步骤S371。
S371:子线程根据队列编号访问队列,进入步骤S372。
S372:获取一个队列元素,进入步骤S373。
需要说明的是,步骤S372所述的获取一个队列元素,由步骤321通过唤醒处理线程,执行步骤500得到。
S373:判断数据是否有效。
若数据有效,进入步骤S380,若数据无效,进入步骤S390。
S380:处理数据,转至步骤S371。
需要说明的是,本实施例中所述处理数据包括:根据从队列里获取的待处理子单元的任务类型,调用相应的处理函数,进行业务相关的数据计算和存储。
S390:线程退出,进入步骤S391。
S391:结束。
具体地,请参考图6,步骤S400包括:
S410:开始,进入步骤S411。
S411:为队列编号,进入步骤S412。
本实施例中,设置用于遍历队列的队列编号为0,从0开始为队列进行编号。
S412:根据队列编号获取队列元素个数,进入步骤S413。
S413:判断队列元素个数是否大于0。
若判断结果为是,进入步骤S431,若判断结果为否,进入步骤S420。
S420:判断线程池中是否有该队列编号的处理线程。
若判断结果为是,进入步骤S430,若判断结果为否,进入步骤S440。
S430:判断队列处理线程是否空闲。
若判断结果为是,进入步骤S442,若判断结果为否,进入步骤S440。
S431:保存队列元素最少的队列编号,进入步骤S432。
S432:队列编号值加1,进入步骤S433。
S433:判断队列编号是否等于队列总数。
需要说明的是,所述队列总数即为mQueMum。
若判断结果为是,进入步骤S434;若判断结果为否,转至步骤S412。
S434:将该待处理子单元压入元素最少的队列。
S440:为队列创建处理子线程,并为线程处理函数指定队列编号,进入步骤S441。
S441:将队列的处理子线程纳入线程池,进入步骤S442。
S442:根据队列编号,将该待处理子单元压入对应的队列并唤醒处理线程,进入步骤S443。
S443:结束。
本发明通过封装待处理数据项的差异性,支持自由投递队列,只需在子线程处理函数内根据处理类型实现差异化处理,提升了软件架构的稳定性、通用性和灵活性。另外,智能化投递队列元素提升了子线程的利用率,提升了程序处理性能。
进一步地,步骤S400还包括轮询均衡队列负载,请参考图7,所述轮询均衡队列负载的步骤包括:
S450:开始,进入步骤S451。
S451:获取线程池中子线程个数,进入步骤S452。
S452:设置用于遍历队列的队列编号为0,将循环计数值设置为1,进入步骤S453。
S453:根据队列编号查询队列元素个数是否大于1。
若队列元素个数大于1,进入步骤S460;若队列元素个数不大于1,进入步骤S470。
S460:判断是否有空队列编号。
若判断结果为是,进入步骤S461;若判断结果为否,进入步骤S471。
S461:从队列中移出一个待调整元素,进入步骤S462。
S462:从空队列编号记录中移出一个空队列编号,进入步骤S463。
S463:根据空队列编号把待调整元素压入空队列并唤醒处理线程,进入步骤S471。
S470:记录该空队列编号,进入步骤S471。
S471:队列编号加1,进入步骤S472。
S472:判断队列编号是否等于线程池子线程个数。
若判断结果为是,进入步骤S473;若判断结果为否,转至步骤S453。
S473:判断循环计数值是否大于1。
若循环计数值大于1,进入步骤S490;若循环计数值不大于1,进入步骤S480。
S480:循环计数值加1,并置队列编号为0,进入步骤S453。
S490:结束。
具体地,请参考图8,步骤S500包括:
S510:开始,进入步骤S520。
S520:尝试从队列中获取一个元素,进入步骤S530。
S530:判断队列是否为空。
若队列为空,进入步骤S540;若队列不为空,进入步骤S560。
S540:判断是否程序要求停止。
若判断结果为是,进入步骤S570;若判断结果为否,进入步骤S550。
S550:队列进入等待状态,直至主线程把新的待处理子单元压入队列,并唤醒处理线程,转至步骤S520。
需要说明的是,队列进入等待状态后,会相应让渡中央处理器资源和锁资源,提升了系统资源的利用率。
S560:移出一个队列元素,进入步骤S570。
S570:结束。
具体地,请参考图9,步骤S600包括:
S610:开始,进入步骤S620。
S620:判断待处理子单元的任务类型,进入步骤S630。
本实施例中,假设待处理子单元的任务类型包括处理类型1、处理类型2和处理类型3。
S630:根据待处理子单元的任务类型,选择相应的处理函数,进入步骤S640。
本实施例中,待处理子单元类型为处理类型1时,转至处理函数1;待处理子单元类型为处理类型2时,转至处理函数2;待处理子单元类型为处理类型3时,转至处理函数3。
S640:结束。
本发明还相应提出了一种基于自定义条件队列的多线程处理数据的系统,用于实现如前文所述的基于自定义条件队列的多线程处理数据的方法。
综上所述,本发明提供了一种基于自定义条件队列的多线程处理数据的方法及系统,用于提升多线程处理数据的性能,本发明提供的方法提升了系统资源的利用率,提升了系统处理各类数据的扩展性,避免了多线程争抢共享数据的可能,省去了引入锁机制同步数据产生的时间消耗,实现了运行状态下的动态负载均衡,提升了软件架构的稳定性、通用性和灵活性。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种基于自定义条件队列的多线程处理数据的方法,其特征在于,所述方法包括:
创建数据处理类对象,对可创建的最大子线程数量进行初始化设置;
根据所述可创建的最大子线程数量创建自定义双端条件队列;
主线程调用所述数据处理类对象处理数据,逐一分解出待处理项;
所述主线程封装待处理项后投递队列,并分配处理的子线程;
所述子线程从双端条件队列获取一个元素;
所述子线程根据元素的任务类型对元素内的数据进行处理。
2.根据权利要求1所述的一种基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“创建数据处理类对象,对可创建的最大子线程数量进行初始化设置”包括:
创建所述数据处理类对象;
获取系统的中央处理器核心数,根据所述中央处理器核心数,确定可创建子线程的最大值;
根据所述可创建子线程的最大值,创建自定义双端条件队列数组。
3.根据权利要求1所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“主线程调用所述数据处理类对象处理数据,逐一分解出待处理项”包括:
所述主线程调用所述数据处理类对象处理数据;
判断能否从所述数据中分解出一个待处理项;
若能够从所述数据中分解出一个所述待处理项,将该待处理项封装为待处理子单元,投递所述待处理子单元,并分配处理的子线程;
若不能从所述数据中分解出一个所述待处理项,判断是否需要等待所有所述队列元素处理完成;
若需要等待所有所述队列元素处理完成,判断各个所述队列是否为空;
若各个所述队列不为空,轮询均衡所述队列负载;
若各个所述队列为空,判断各个所述队列的线程是否空闲;
若各个所述队列的线程不为空闲,重复判断各个所述队列的线程是否空闲。
4.根据权利要求3所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“所述主线程封装待处理项后投递队列,并分配处理的子线程”包括:
设置用于遍历队列的队列编号为0;
根据所述队列编号获取所述队列元素个数;
判断所述队列元素个数是否大于0;
若所述队列元素个数大于0,保存队列元素最少的所述队列编号;
所述队列编号值加1;
判断所述队列编号是否等于所述队列总数;
若所述队列编号等于所述队列总数,将该待处理子单元压入元素最少的所述队列,若判断结果为否,重复所述“根据所述队列编号获取队列元素个数”的步骤。
5.根据权利要求4所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,还包括:
若所述队列元素个数不大于0,判断线程池中是否有该队列编号的处理线程;
若所述线程池中没有该队列编号的处理线程,为所述队列创建处理子线程,并为线程处理函数指定所述队列编号,将所述队列的所述处理子线程纳入所述线程池,根据所述队列编号,将该待处理子单元压入对应的所述队列并唤醒处理线程;
若所述线程池中有该队列编号的处理线程,判断所述队列处理线程是否空闲;
若所述队列处理线程空闲,根据所述队列编号,将该待处理子单元压入对应的所述队列并唤醒处理线程;
若所述队列处理线程不为空闲,执行所述“保存队列元素最少的所述队列编号”的步骤。
6.根据权利要求5所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“轮询均衡所述队列负载”包括:
获取所述线程池中子线程个数;
设置用于遍历队列的队列编号为0,将循环计数值设置为1;
根据所述队列编号查询所述队列元素个数是否大于1;
若所述队列元素个数不大于1,记录该空队列编号,所述队列编号加1;
若所述队列元素个数大于1,判断是否有空队列编号;
若有空队列编号,从所述队列中移出一个待调整元素,从所述空队列编号记录中移出一个空队列编号,根据所述空队列编号把待调整元素压入所述空队列并唤醒处理线程,所述队列编号加1;
若没有空队列编号,所述队列编号加1;
所述队列编号加1后,判断所述队列编号是否等于所述线程池子线程个数;
若所述队列编号不等于所述线程池子线程个数,执行所述“根据所述队列编号查询所述队列元素个数是否大于1”的步骤;
若所述队列编号等于所述线程池子线程个数,判断所述循环计数值是否大于1;
若所述循环计数值不大于1,循环计数值加1,并置队列编号为0,执行所述“根据所述队列编号查询所述队列元素个数是否大于1”的步骤。
7.根据权利要求3-6任一项所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“主线程调用所述数据处理类对象处理数据,逐一分解出待处理项”还包括:
子线程根据所述队列编号访问所述队列;
获取一个所述“投递所述待处理子单元,并分配处理的子线程”步骤通过唤醒处理线程,执行所述“所述子线程从双端条件队列获取一个元素”,得到所述队列元素;
判断数据是否有效;
若所述数据有效,根据从队列里获取的待处理子单元的任务类型,调用相应的处理函数,进行业务相关的数据计算和存储,并重复执行所述“子线程根据所述队列编号访问所述队列”的步骤。
8.根据权利要求3所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“所述子线程从双端条件队列获取一个元素”包括:
尝试从所述队列中获取一个元素;
判断所述队列是否为空;
若所述队列不为空,移出一个队列元素;
若所述队列为空,判断是否程序要求停止;
若所述程序不要求停止,所述队列进入等待状态,直至所述主线程把新的待处理子单元压入所述队列,并唤醒处理线程。
9.根据权利要求8所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“所述子线程根据元素的任务类型对元素内的数据进行处理”包括:
判断所述待处理子单元的任务类型;
根据所述待处理子单元的任务类型,选择相应的处理函数。
10.一种基于自定义条件队列的多线程处理数据的系统,其特征在于,所述系统用于实现如权利要求1-9任一项所述的基于自定义条件队列的多线程处理数据的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210164004.8A CN114595044A (zh) | 2022-02-22 | 2022-02-22 | 一种基于自定义条件队列的多线程处理数据的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210164004.8A CN114595044A (zh) | 2022-02-22 | 2022-02-22 | 一种基于自定义条件队列的多线程处理数据的方法及系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114595044A true CN114595044A (zh) | 2022-06-07 |
Family
ID=81806095
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210164004.8A Pending CN114595044A (zh) | 2022-02-22 | 2022-02-22 | 一种基于自定义条件队列的多线程处理数据的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114595044A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116401990A (zh) * | 2023-01-30 | 2023-07-07 | 芯华章科技(北京)有限公司 | 处理中断事件的方法、装置、系统和存储介质 |
-
2022
- 2022-02-22 CN CN202210164004.8A patent/CN114595044A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116401990A (zh) * | 2023-01-30 | 2023-07-07 | 芯华章科技(北京)有限公司 | 处理中断事件的方法、装置、系统和存储介质 |
CN116401990B (zh) * | 2023-01-30 | 2023-10-20 | 芯华章科技(北京)有限公司 | 处理中断事件的方法、装置、系统和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10545789B2 (en) | Task scheduling for highly concurrent analytical and transaction workloads | |
US10241831B2 (en) | Dynamic co-scheduling of hardware contexts for parallel runtime systems on shared machines | |
JP2829078B2 (ja) | プロセス分散方法 | |
US4631674A (en) | Active wait | |
US20150286586A1 (en) | System and Method for Implementing Scalable Adaptive Reader-Writer Locks | |
US7386857B2 (en) | Application connector parallelism in enterprise application integration systems | |
US20060277551A1 (en) | Administration of locks for critical sections of computer programs in a computer that supports a multiplicity of logical partitions | |
CN112465129A (zh) | 片内异构人工智能处理器 | |
JP4568292B2 (ja) | キャッシュライン・ポーリングを実行する方法、装置、プログラム及び情報処理システム | |
US20100131956A1 (en) | Methods and systems for managing program-level parallelism | |
CN111427751B (zh) | 基于异步处理机制对业务进行处理的方法及系统 | |
KR20110071018A (ko) | 시스템 태스크를 실행하는 복수의 프로세싱 코어를 포함하는 정보 프로세싱 시스템의 결정적 실행 및 동기화 방법 | |
WO2020063041A1 (zh) | 多核处理器的调度方法、装置、终端及存储介质 | |
CN1898647B (zh) | 具有被动线程和活动信标的处理架构 | |
CN114595044A (zh) | 一种基于自定义条件队列的多线程处理数据的方法及系统 | |
CN107220111B (zh) | 一种基于任务窃取的任务调度方法及系统 | |
CN109753358B (zh) | 任务处理方法及装置 | |
CN111459622B (zh) | 调度虚拟cpu的方法、装置、计算机设备和存储介质 | |
CN101189579A (zh) | 基于行为模型的多线程体系结构 | |
CN113326149A (zh) | 异构多核系统的核间通信方法和设备 | |
JPH05250337A (ja) | 処理をプロセッサにディスパッチするためのマイクロプログラム手段を有するマルチプロセッサシステム | |
US9760969B2 (en) | Graphic processing system and method thereof | |
JP2016509306A (ja) | クラスタにおけるワークシェアリング多重化をサポートするためのシステムおよび方法 | |
US11861416B2 (en) | Critical section speedup using help-enabled locks | |
CN115658278A (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 |