一种基于自定义条件队列的多线程处理数据的方法及系统技术方案

技术编号:33728903 阅读:29 留言:0更新日期:2022-06-08 21:23
本发明专利技术提供了一种基于自定义条件队列的多线程处理数据的方法及系统,方法包括创建数据处理类对象,对可创建的最大子线程数量进行初始化设置,根据可创建的最大子线程数量创建自定义双端条件队列,主线程调用数据处理类对象处理数据,逐一分解出待处理项,主线程封装待处理项后投递队列,并分配处理的子线程,子线程从双端条件队列获取一个元素,子线程根据元素的任务类型对元素内的数据进行处理。本发明专利技术提供的方法提升了系统资源的利用率,提升了系统处理各类数据的扩展性,避免了多线程争抢共享数据的可能,省去了引入锁机制同步数据产生的时间消耗,提升了子线程的利用率及程序处理性能。理性能。理性能。

【技术实现步骤摘要】
一种基于自定义条件队列的多线程处理数据的方法及系统


[0001]本专利技术属于
,具体涉及一种基于自定义条件队列的多线程处理数据的方法及系统。

技术介绍

[0002]应用软件被要求有更高的处理性能。为了提升应用软件的处理性能,可以在程序设计时采用并行技术,或是从硬件层面配置更多的CPU和更多的内存,但硬件层面的提升往往需要投入更大的采购成本,而软件层面应用并行处理技术的提升,则相对更为廉价,往往是首选方案。
[0003]广义的并行,即要求一个程序在同一时刻同时处理多个任务。为了提升程序的处理性能,常常采用多进程或多线程这两种并行处理技术。多进程相对多线程而言,具有进程间资源相互隔离,编程简单且可靠性高的优势,但是也存在占用内存较多,CPU利用率较低的缺点。
[0004]因此,多进程技术适用于弱相关的多任务并行处理,并不适用于需要消耗很多CPU进行大量计算的应用场景。多线程技术因为数据共享简单、占用内存少、CPU利用率高等特点,广泛应用于数据处理领域。
[0005]但对于数据计算和数据分析业务,比如芯片测试行业中调制特性的计算或信令数据合成,如果利用传统的多线程处理技术,往往需要引入互斥锁、读写锁、自旋锁或信号量等来解决多线程间资源争抢或数据同步的问题,一不小心还可能引入死锁的bug。
[0006]另外,目前软件开发中大部分多线程处理数据的方法,局限于将一个大任务分解成若干个同质子任务进行并行处理,而对异质子任务的并行处理束手无策,即只能提升部分数据的处理性能。一旦各类子任务的数量不均衡,就会出现有的队列任务很快被处理完成,线程白白空跑,占用系统资源,有的队列任务积压,线程忙不过来的场景,最终导致程序的处理性能不稳定。
[0007]出现上述情况时,虽然可以通过结合业务数据分析的方式进行补救,但需要为那些数量大或处理耗时的子任务类型创建更多的处理队列来均衡负载,为此也需要额外创建更多的处理线程。这种事后补救方式,CPU有效利用率不高,实现复杂而不通用;一旦业务发生变化,各类子任务的数量也发生变化,显得捉襟见肘。

技术实现思路

[0008]为了克服上述现有技术的缺陷,本专利技术提出了一种基于自定义条件队列的多线程处理数据的方法,所述方法包括:
[0009]创建数据处理类对象,对可创建的最大子线程数量进行初始化设置;
[0010]根据所述可创建的最大子线程数量创建自定义双端条件队列;
[0011]主线程调用所述数据处理类对象处理数据,逐一分解出待处理项;
[0012]所述主线程封装待处理项后投递队列,并分配处理的子线程;
[0013]所述子线程从双端条件队列获取一个元素;
[0014]所述子线程根据元素的任务类型对元素内的数据进行处理。
[0015]具体地,所述“创建数据处理类对象,对可创建的最大子线程数量进行初始化设置”包括:
[0016]创建所述数据处理类对象;
[0017]获取系统的中央处理器核心数,根据所述中央处理器核心数,确定可创建子线程的最大值;
[0018]根据所述可创建子线程的最大值,创建自定义双端条件队列数组。
[0019]具体地,所述“主线程调用所述数据处理类对象处理数据,逐一分解出待处理项”包括:
[0020]所述主线程调用所述数据处理类对象处理数据;
[0021]判断能否从所述数据中分解出一个待处理项;
[0022]若能够从所述数据中分解出一个所述待处理项,将该待处理项封装为待处理子单元,投递所述待处理子单元,并分配处理的子线程;
[0023]若不能从所述数据中分解出一个所述待处理项,判断是否需要等待所有所述队列元素处理完成;
[0024]若需要等待所有所述队列元素处理完成,判断各个所述队列是否为空;
[0025]若各个所述队列不为空,轮询均衡所述队列负载;
[0026]若各个所述队列为空,判断各个所述队列的线程是否空闲;
[0027]若各个所述队列的线程不为空闲,重复判断各个所述队列的线程是否空闲。
[0028]具体地,所述“所述主线程封装待处理项后投递队列,并分配处理的子线程”包括:
[0029]设置用于遍历队列的队列编号为0;
[0030]根据所述队列编号获取所述队列元素个数;
[0031]判断所述队列元素个数是否大于0;
[0032]若所述队列元素个数大于0,保存队列元素最少的所述队列编号;
[0033]所述队列编号值加1;
[0034]判断所述队列编号是否等于所述队列总数;
[0035]若所述队列编号等于所述队列总数,将该待处理子单元压入元素最少的所述队列,若判断结果为否,重复所述“根据队列编号获取队列元素个数”的步骤。
[0036]进一步地,还包括:
[0037]若所述队列元素个数不大于0,判断线程池中是否有该队列编号的处理线程;
[0038]若所述线程池中没有该队列编号的处理线程,为所述队列创建处理子线程,并为线程处理函数指定所述队列编号,将所述队列的所述处理子线程纳入所述线程池,根据所述队列编号,将该待处理子单元压入对应的所述队列并唤醒处理线程;
[0039]若所述线程池中有该队列编号的处理线程,判断所述队列处理线程是否空闲;
[0040]若所述队列处理线程空闲,根据所述队列编号,将该待处理子单元压入对应的所述队列并唤醒处理线程;
[0041]若所述队列处理线程不为空闲,执行所述“保存队列元素最少的所述队列编号”的步骤。
[0042]进一步地,所述“轮询均衡所述队列负载”包括:
[0043]获取所述线程池中子线程个数;
[0044]设置用于遍历队列的队列编号为0,将循环计数值设置为1;
[0045]根据所述队列编号查询所述队列元素个数是否大于1;
[0046]若所述队列元素个数不大于1,记录该空队列编号,所述队列编号加1;
[0047]若所述队列元素个数大于1,判断是否有空队列编号;
[0048]若有空队列编号,从所述队列中移出一个待调整元素,从所述空队列编号记录中移出一个空队列编号,根据所述空队列编号把待调整元素压入所述空队列并唤醒处理线程,所述队列编号加1;
[0049]若没有空队列编号,所述队列编号加1;
[0050]所述队列编号加1后,判断所述队列编号是否等于所述线程池子线程个数;
[0051]若所述队列编号不等于所述线程池子线程个数,执行所述“根据所述队列编号查询所述队列元素个数是否大于1”的步骤;
[0052]若所述队列编号等于所述线程池子线程个数,判断所述循环计数值是否大于1;
[0053]若所述循环计数值不大于1,循环计数值加1,并置队列编号为0,执行所述“根据所述队列编号查询所述队列元素个数是否大于1”的步骤。
[0054]进一步地,所述“主线程调用所述数据处理类对象处理数据,逐一分解本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于自定义条件队列的多线程处理数据的方法,其特征在于,所述方法包括:创建数据处理类对象,对可创建的最大子线程数量进行初始化设置;根据所述可创建的最大子线程数量创建自定义双端条件队列;主线程调用所述数据处理类对象处理数据,逐一分解出待处理项;所述主线程封装待处理项后投递队列,并分配处理的子线程;所述子线程从双端条件队列获取一个元素;所述子线程根据元素的任务类型对元素内的数据进行处理。2.根据权利要求1所述的一种基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“创建数据处理类对象,对可创建的最大子线程数量进行初始化设置”包括:创建所述数据处理类对象;获取系统的中央处理器核心数,根据所述中央处理器核心数,确定可创建子线程的最大值;根据所述可创建子线程的最大值,创建自定义双端条件队列数组。3.根据权利要求1所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“主线程调用所述数据处理类对象处理数据,逐一分解出待处理项”包括:所述主线程调用所述数据处理类对象处理数据;判断能否从所述数据中分解出一个待处理项;若能够从所述数据中分解出一个所述待处理项,将该待处理项封装为待处理子单元,投递所述待处理子单元,并分配处理的子线程;若不能从所述数据中分解出一个所述待处理项,判断是否需要等待所有所述队列元素处理完成;若需要等待所有所述队列元素处理完成,判断各个所述队列是否为空;若各个所述队列不为空,轮询均衡所述队列负载;若各个所述队列为空,判断各个所述队列的线程是否空闲;若各个所述队列的线程不为空闲,重复判断各个所述队列的线程是否空闲。4.根据权利要求3所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,所述“所述主线程封装待处理项后投递队列,并分配处理的子线程”包括:设置用于遍历队列的队列编号为0;根据所述队列编号获取所述队列元素个数;判断所述队列元素个数是否大于0;若所述队列元素个数大于0,保存队列元素最少的所述队列编号;所述队列编号值加1;判断所述队列编号是否等于所述队列总数;若所述队列编号等于所述队列总数,将该待处理子单元压入元素最少的所述队列,若判断结果为否,重复所述“根据所述队列编号获取队列元素个数”的步骤。5.根据权利要求4所述的基于自定义条件队列的多线程处理数据的方法,其特征在于,还包括:若所述队列元素个数不大于0,判断线程池中是否有该队列编号的处理线程;若所述线程池中没有该队列编号的处理线程,为所述队列创建处理子线程,并为线程
处理函数指定所述队列编号,将所述队列的所述处理子线程纳入所述线程池,根据所述队列编号,将该待处理子单元压入对应的所述队列并唤醒处理线程;若所述线程池中有该队列编号的处理线程,判断所述队列处理线程是否空闲;若所述队列处理线程空闲,根据所述队列编号,将该待处理子单元压入对应的...

【专利技术属性】
技术研发人员:陈永邬刚
申请(专利权)人:杭州加速科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1