CN106325980A - 一种多线程并发系统 - Google Patents
一种多线程并发系统 Download PDFInfo
- Publication number
- CN106325980A CN106325980A CN201510373314.0A CN201510373314A CN106325980A CN 106325980 A CN106325980 A CN 106325980A CN 201510373314 A CN201510373314 A CN 201510373314A CN 106325980 A CN106325980 A CN 106325980A
- Authority
- CN
- China
- Prior art keywords
- task
- thread
- thread pool
- type
- lock
- 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
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种多线程并发系统,包括:任务拆分模块,其将待执行任务分割成多个任务;任务配置模块,其对分割后的每个任务进行属性配置;线程池模块,其根据每个任务的属性建立相应类型的线程池,并对多个任务执行多线程并发处理。利用本发明的多线程并发系统可以充分发挥计算机的性能,灵活配置复杂任务的派发策略,提高任务的执行效率。
Description
技术领域
本发明涉及计算机技术的软件开发领域,具体涉及多线程并发系统。
背景技术
随着信息技术的发展,多核CPU已经成为了服务器的标配,传统的单线程程序往往无法充分发挥服务器的性能优势。同时,服务器CPU的运算速度远远高于网络IO以及硬盘IO(IO指输入/输出,常见的输入/输出包括网络数据传输以及硬盘数据读写),传统涉及IO的串行程序的执行时间主要消耗在网络IO和硬盘IO上,利用多线程技术并发处理IO,可以显著减少IO任务的执行时间。
现有的多线程框架,比如Boost、JTC等等,主要强调线程池的创建、管理以及多线程执行过程中共享内存的保护。根据实现模型的不同,可以分为半同步/半异步模型和领导者/跟随者模型。其中半同步/半异步模型使用一个监听线程负责接收请求,并写入缓存队列,另外一组工作线程处理请求。领导者/跟随者模型使用一个领导者线程,其他线程为跟随者。领导者监听并负责接收请求,在接收到一个请求后,领导者开始处理请求,并在跟随者中选取一个新的领导者。
现有多线程框架在任务调度方面的功能比较单一,缺少一种配置灵活,可扩展的任务调度模式。另外,对于任务的类型,比如耗内存任务,耗CPU任务,耗物理IO任务也没有进行细分。
因此,针对上述问题,需要一种灵活性更强、可扩展的高效多线程并发系统。
发明内容
本发明所要解决的技术问题之一是需要提供一种灵活性更强、可扩展的高效多线程并发系统。
为了解决上述技术问题,本申请的实施例首先提供了一种多线程并发系统,包括:任务拆分模块,其将待执行任务分割成多个任务;任务配置模块,其对分割后的每个任务进行属性配置;线程池模块,其根据每个任务的属性建立相应类型的线程池,并对多个任务执行多线程并发处理。
优选地,所述任务配置模块包括:任务描述单元,其对分割后的每个任务进行描述进而确定每个任务的任务属性;锁策略单元,其设置每个任务的锁类型,进而在多线程并发处理时控制线程之间以何种方式阻塞其他线程;派发策略单元,其确定每个任务的派发模式,并针对不同的派发模式确定相应的派发策略;进一步所述线程池模块根据每个任务的任务属性、锁类型和派发策略,建立相应类型的线程池,并对多个任务执行多线程并发处理。
优选地,所述任务属性包括任务ID、任务优先级、任务状态、任务类型和任务所属工作线程。
优选地,所述任务描述单元采用插槽机制将多个任务之间的函数串联起来执行。
优选地,所述锁类型包括读锁、写锁、常规锁和基于超时的锁。
优选地,所述任务类型包括耗内存任务、耗CPU任务、耗物理IO任务和常规型任务;所述派发模式包括耗内存任务派发、耗CPU任务派发和耗物理IO任务派发,所述线程池包括内存类型线程池、CPU类型线程池和物理IO类型线程池。
优选地,在所述多个任务包括耗内存任务、耗CPU任务和耗物理IO任务中的任意之一特殊型任务以及常规型任务时,所述线程池模块建立与该特殊性任务对应的线程池并采用相应的派发策略来执行线程并发处理。
优选地,所述线程池模块建立了内存类型线程池后,当所述内存类型线程池中已经存在一个耗内存任务正在执行时,所述线程池模块不并发执行其他耗内存任务而对常规型任务执行线程并发处理。
优选地,所述线程池模块建立了CPU类型线程池后,当所述CPU类型线程池中已经存在一个耗CPU任务正在执行时,所述线程池模块不并发执行其他耗CPU任务而对常规型任务执行线程并发处理。
优选地,所述线程池模块建立了物理IO类型线程池后,当所述物理IO类型线程池中已经存在一个耗物理IO任务正在执行时,所述线程池模块不并发执行其他耗物理IO任务而对常规型任务执行线程并发处理。
与现有技术相比,上述方案中的一个或多个实施例可以具有如下优点或有益效果。
针对现有多线程并发系统在任务调度方面的功能较单一,任务配置灵活性较低的不足,本发明实施例的多线程并发系统通过引入任务拆分模块、任务配置模块(包括任务描述单元、锁策略单元和派发策略单元)、线程池模块,支持任务在多线程执行时多种策略的任务调度,针对耗内存任务、耗CPU任务和耗物理IO任务给出了不同的优化措施,支持使用读锁、写锁、常规锁和基于超时的锁进行并发控制。
另外,本发明实施例的多线程并发系统还支持基于插槽机制的任务协作,可以把函数执行的顺序以插槽的方式串联起来,增加灵活性。
在派发策略、锁机制方面,普遍使用了基于模板的技术,增强了系统的可扩展性。利用本发明的多线程并发系统可以充分发挥计算机的性能,灵活配置复杂任务的派发策略,提高任务的执行效率。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明的技术方案而了解。本发明的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构和/或流程来实现和获得。
附图说明
附图用来提供对本申请的技术方案或现有技术的进一步理解,并且构成说明书的一部分。其中,表达本申请实施例的附图与本申请的实施例一起用于解释本申请的技术方案,但并不构成对本申请技术方案的限制。
图1为本申请实施例的多线程并发系统的结构示意图。
图2为本申请实施例的实现多线程并发系统的类协作图。
图3为本申请实施例的多线程并发系统的工作流程示意图。
图4(a)、图4(b)、图4(c)、图4(d)、图4(e)、图4(f)为利用图1所示的多线程并发系统实现任务一和任务二的不同阶段的示意图。
具体实施方式
以下将结合附图及实施例来详细说明本发明的实施方式,借此对本发明如何应用技术手段来解决技术问题,并达成相应技术效果的实现过程能充分理解并据以实施。本申请实施例以及实施例中的各个特征,在不相冲突前提下可以相互结合,所形成的技术方案均在本发明的保护范围之内。
另外,附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
针对现有多线程框架所存在的不足,即现有多线程框架在任务调度方面的功能比较单一,缺少一种配置灵活,可扩展的任务调度模式,另外,对于任务的类型,比如耗内存任务,耗CPU任务,耗物理IO任务也没有进行细分,本发明提出了一种高效多线程并发系统,该系统在执行不同类型的任务时将采取不同的调度方法,实现任务执行顺序的最优化配置。
图1是本申请实施例的多线程并发系统的结构示意图。如图1所示,该系统主要包括三个模块:任务拆分模块10、任务配置模块20以及线程池模块30。
如图1所示,线程池模块30会创建一个具体的线程池,可以是CPU类型线程池、内存类型线程池或者物理IO类型线程池。随后线程池启动工作线程,并监听任务队列,等待任务到来。复杂任务在进入线程池之前,任务拆分模块10将其拆分成若干个小任务(如图1中的任务1、任务2……任务n),之后每个任务进入任务配置模块20中,任务配置模块20对每个任务设置任务类型、优先级等信息,然后将每个任务加入到线程池的任务队列。线程池的工作线程收到任务到来的信号,按照自己的派发策略执行任务。
下面参考图1来说明该系统的组成和功能。
任务拆分模块10,其将待执行任务分割成多个任务。具体地,任务拆分模块10对于复杂任务,比如耗内存任务、耗CPU任务和耗物理IO任务,需要预先将该复杂任务进行拆分,生成若干份可以并行执行的小任务。
任务配置模块20,其对分割后的每个任务进行属性配置。如图1所示,该任务配置模块20包括任务描述单元201、锁策略单元202和派发策略单元203。任务描述单元201,其对分割后的每个任务进行描述进而确定每个任务的任务属性,任务属性包括任务ID、任务优先级、任务状态、任务类型和任务所属工作线程。锁策略单元202,其设置每个任务的锁类型,进而在多线程并发执行时控制线程之间以何种方式阻塞其他线程,锁类型包括包括读锁、写锁、常规锁和基于超时的锁。派发策略单元203,其确定每个任务的派发模式,并针对不同的派发模式确定相应的派发策略,派发模式包括耗内存任务派发、耗CPU任务派发和耗物理IO任务派发。
线程池模块30,其根据每个任务的属性选择相应类型的线程池,并对多个任务执行多线程并发处理。具体地,线程池模块30,其根据每个任务的任务属性、锁类型和派发策略,选择相应类型的线程池,并对多个任务执行多线程并发处理。线程池包括内存类型线程池、CPU类型线程池和物理IO类型线程池。
在本实施例中采用计算机程序中c++类的模式来具体实现上述系统的各个单元或者模块,但本领域技术人员容易理解,该实施例仅为一个例子,并不限定本发明的保护范围,还可以采用其他方式来实现本系统,例如使用其他面向对象语言(java、python等)和面向过程语言(c等)均可以实现本多线程并发框架。同时本发明并不限定平台,Unix/Linux和Windows操作系统均可作为本发明的底层开发平台。
图2为本申请实施例的实现多线程并发系统的类协作图,其中主要包括线程池CAnyThreadPool、任务CAnyTask和锁CAnyLockable三个基类。线程池根据派发策略,派生出CAnyCPUScheduler等子类,任务类引入插槽函数后派生出CAnySignalTask子类,锁类根据锁类型派生出4个锁子类。任务类通过锁类设置并发执行时的锁类型,线程池的工作线程负责执行任务类。
更具体地,CAnyTask是任务基类,具体描述了任务的优先级,状态等信息,CAnySignalTask是其子类,子类继承并额外实现了任务启动与设置超时的操作。CAnyLockable是锁基类,它有四个不同类型的子类,分别是CAnyReadLockable、CAnyWriteLockable、CAnyNormalLockable和CAnyTimedLockable,它们分别实现了读锁、写锁、常规锁以及超时锁的功能。CAnySignalTask选择其中一种锁,作为多任务并发时使用的锁。CAnyThreadPool是线程池基类,具体描述了线程池对线程的管理操作,CAnyThreadScheduler是其子类,继承并额外增加了派发策略函数。CAnyCPUScheduler是CAnyThreadScheduler的子类,具体实现了耗CPU任务的派发策略,支持不断接收和派发任务(CAnySignalTask)。
如图2所示,类CAnyTask、CAnyLockable、CAnyThreadScheduler、CAnyThreadPool分别实现了任务描述单元201、锁策略单元202、派发策略单元203和线程池模块30。在后文中这些模块也可以被称为任务描述类、锁策略类、派发策略类和线程池类。
需要说明的是,每个类图自上之下依次表示类名、数据成员组成和方法成员组成。如图2所示的类图CAnyTask,任务描述类的数据成员包括:任务ID、任务优先级(Priority)、任务状态(State)、任务类型和任务所属工作线程等信息。
任务描述类封装了任务的共性信息,其中任务的优先级可以决定服务器端任务队列中的多项任务的执行顺序。优选地,任务优先级由数字表述,数字越大则说明优先级越高。
在本发明实施例中,任务类型分为耗内存任务、耗CPU任务、耗物理IO任务和常规型任务。任务类型可在特殊的派发策略单元203中发挥作用,比如基于内存占用率的派发策略,在同一时间只允许一个耗内存任务在执行,因此,当线程池中已经运行一个耗内存的任务时,即使其他耗内存任务的优先级较高,但线程池还是会优先执行常规任务。
任务状态描述了在线程池中的任务是处于等待、执行还是结束状态,它们可以供任务的提交者(客户端)实时了解自己提交任务的状态。
任务描述类是一个基类,具体的任务类继承自该基类。客户端设置好任务的类型、优先级后,可以调用线程池的AddTask方法,将任务放入任务队列,由线程池的工作线程按照派发策略执行并返回计算结果。在调用线程池AddTask方法的时候,还需要设置锁类型参数,这个锁类型参数在多线程并发执行的时候,会根据锁策略对共享资源进行锁定。
同时,本发明实施例还支持使用模板类的基于插槽机制的任务协作,即任务描述单元201可以把函数执行的顺序以插槽的方式串联起来,支持灵活的执行顺序。在本发明实施例中,将上述这种功能实现在CAnyTask类的子类CAnySignalTask,其结构如下所示。
其中,模板类中的模板参数Signature定义了插槽函数的参数列表和返回类型,参数Lockable定义了锁类型。CAnySignalTask有两个关键函数:connect()和run()。connect函数负责插槽函数的拼接,run函数负责任务的执行逻辑。线程池的工作线程提取任务后,会执行任务的run函数。CAnySignalTask的run函数会先根据锁类型,生成不同的互斥量,用于多线程并发执行时的阻塞模式,并在该锁的保护下,执行任务逻辑DoExecuteTask函数,任务完成后再执行connect添加的插槽函数。
锁策略单元202也可以是一个类,具体参见图2所示的类图CAnyLockable。它的数据成员包括:一个用于同步的对象。锁策略单元202的成员函数包括:获取锁函数Aquire()和释放锁函数Release()。CAnyLockable是一个基类,不同类型的锁继承自该基类。
在本实施例中,锁类型包括读锁(CAnyReadLockable)、写锁(CAnyWriteLockable)、常规锁(CAnyNormalLockable)和基于超时的锁(CAnyTimedLockable)共四种锁。其中常规锁保护的程序块同一时间只能有一个线程在执行,其他线程必须等待。基于超时的锁限制了常规锁的锁定时间,如果某一个线程占用锁的时间超过了设定的最大等待时间,它将自动释放锁。其中最大等待时间通过基于超时的锁构造函数中的参数来进行设置。读锁和写锁是一对联合控制的锁,其中读锁与读锁之间不互斥,多个线程可以并发执行同一段受读锁保护的程序块,但加入写锁后,同一时间只有获取写锁的线程可以访问程序块。当存在读锁的时候,写锁的获取分为两步,第一步是阻止其他线程获取读锁,第二步是等待目前的读锁持有者执行完毕,释放读锁,当所有读锁释放完毕后,线程可以成功获取写锁。
另外,基于上述锁,还设计了CAnyScopeGuard类(未图示),其用于对需要并发保护的程序块进行自动加锁。CAnyScopeGuard的构造函数自动调用锁的Aquire()函数获取锁,其析构函数自动调用Release()函数释放锁,因此只需要在程序块的开头声明一个CAnyScopeGuard变量,即可起到保护程序块内多线程并发访问的作用。CAnyScopeGuard类的结构如下所示。
如图2所示的类图CAnyThreadScheduler,它实现了派发策略单元203的具体功能。它在形式上是线程池的一个子类,自动继承了线程池的创建、回收线程,获取、执行任务的接口,同时CAnyThreadScheduler增加了DispatchStrategy()虚函数负责任务的调度。通过定义CAnyThreadScheduler的不同子类,可以重写DispatchStrategy()虚函数,从而实现针对不同模式的派发策略,目前主要的派发模式包括:耗内存任务派发、耗CPU任务派发和耗物理IO任务派发。
在多个任务包括耗内存任务、耗CPU任务和耗物理IO任务中的任意之一特殊型任务以及常规型任务时,线程池模块30建立与该特殊性任务对应的线程池并采用相应的派发策略来执行线程并发处理。具体地,线程池模块30建立了内存类型线程池后,当内存类型线程池中已经存在一个耗内存任务正在执行时,线程池模块不并发执行其他耗内存任务而对常规型任务执行线程并发处理。在线程池模块30建立了CPU类型线程池后,当CPU类型线程池中已经存在一个耗CPU任务正在执行时,线程池模块30不并发执行其他耗CPU任务而对常规型任务执行线程并发处理。在线程池模块30建立了物理IO类型线程池后,当物理IO类型线程池中已经存在一个耗物理IO任务正在执行时,线程池模块30不并发执行其他耗物理IO任务而对常规型任务执行线程并发处理。
下面以针对耗CPU任务派发策略(CAnyCPUScheduler)为例,来具体说明线程池模块30是如何根据该策略执行任务的。
首先线程池模块30判断线程池状态,如果为正常状态,则开始监测任务队列,如果任务队列为空,则开始等待新任务到来的信号;如果任务队列非空,则提取任务,并开始执行。
另一方面,如果线程池状态为CPU忙碌,则遍历所有工作线程中正在运行的任务,如果都是非耗CPU类型任务,则将当前线程池状态设置为正常,并将耗CPU任务栈中的任务重新放入任务队列,重新判断线程池状态。相反,如果存在耗CPU类型任务,则开始监测任务队列,如果任务队列为空,与正常状态一样,线程池开始等待;如果任务队列非空,则提取任务,判断任务类型,如果是普通任务,则开始执行,如果是耗CPU类型任务,由于线程池同一时间只能有一个耗CPU任务在运行,所以该任务被放入耗CPU任务栈中,等待线程池中正在运行的耗CPU任务执行结束。
线程池模块30是一个类,具体参见图2所示的类图CAnyThreadPool。它包含的数据成员有:线程池的当前工作线程个数、目标工作线程个数、最大工作线程个数、忙碌工作线程个数、线程池终止的布尔变量、一个用于缓存任务的优先级队列、每一个线程当前正在执行的任务ID的映射表、任务ID到任务的映射表、读写锁映射表、常规锁映射表、有超时锁映射表以及用于线程池内部同步的互斥量。
线程池类拥有线程池管理、工作线程管理和任务管理三大功能。
在线程池管理方面,线程池类负责线程池睡眠、挂起、继续、销毁以及等待线程池进入空闲状态等功能。假设任务集合分为两个阶段,阶段二的任务必须在阶段一的任务全部完成之后才可以开始执行的情境下,等待线程池进入空闲状态是个实用的控制方法。
在工作线程管理方面,线程池类负责工作线程的创建、挂起、继续等功能。线程池类的构造函数的参数列表中包含期望线程的个数target_worker_count,构造函数调用Resize函数创建target_worker_count个工作线程。同时,当任务负载增加,需要更多的工作线程时,也可以调用Resize函数,进行工作线程的动态添加。当特殊优先级任务来临时,线程池类支持正在执行普通任务的工作线程被暂时挂起,并在合适的时间再被重启。
在任务管理方面,线程池类负责任务的添加、执行、优先级设置、从任务队列中删除等功能。
下面参照图3来说明上述多线程并发系统的工作流程。
当客户端有一个需要执行的耗时任务时,任务拆分模块10首先对任务进行分割,将该耗时任务拆分成若干份可以并行执行的小任务。
线程池模块30首先进行初始化动作,生成指定数量的工作线程,并按照派发策略,等待任务的到来。
之后,任务配置模块20对每一个小任务进行任务描述,确定任务的优先级、状态以及类型,锁类型(用于控制多线程并发执行时,线程之间以何种方式阻塞其他线程),绑定执行任务逻辑的函数等等,然后将每个小任务依次发送到线程池的任务队列中。任务队列发出非空信号,工作线程开始按照派发策略,提取并执行任务队列中的任务。
添加到线程池的任务,实际上会首先进入到线程池的任务队列进行等待。线程池在初始化的时候,会启动若干工作线程,工作线程循环访问任务队列,当任务队列非空时,工作线程将提取任务;当任务队列为空时,工作线程将进入等待状态,新任务添加到任务队列时会发送信号,通知工作线程队列非空,可以进行提取任务操作。工作线程提取任务后,开始执行。执行函数是用户自定义的与任务逻辑相关的函数。当任务数大于工作线程数的时候,任务将在任务队列中进入等待状态,这时根据线程池派发策略属性的不同,可以实现不同的效果,比如对于耗内存任务派发策略,每次只能有一个耗内存任务在执行,即当线程池中已经存在一个耗内存任务正在执行,则线程池会阻塞任务队列中的其他耗内存任务被其他工作线程提取和执行,但非耗内存任务可以由其他工作线程并发执行。
因此,根据本发明实施例,任务在被多线程执行的同时,该多线程并发系统支持多种策略的任务调度,针对耗内存任务、耗CPU任务和耗物理IO任务均给出了不同的优化措施。而且,在多线程并发执行中,支持使用读锁、写锁、常规锁和基于超时的锁进行并发控制。另外,本系统支持基于插槽机制的任务协作,可以把函数执行的顺序以插槽的方式串联起来,增加灵活性。进一步,根据本发明实施例,在派发策略、锁机制方面,普遍使用了基于模板的技术,增强了系统的可扩展性。
(示例)
图4(a)、图4(b)、图4(c)、图4(d)、图4(e)、图4(f)分别为利用图1所示的多线程并发系统实现任务一和任务二的不同阶段的示意图。
在本示例中,假定有两个计算任务:基于蒙特卡罗法计算圆周率(任务一)和基于遗传算法计算最优投资组合(任务二)。
前者在单位正方形里内接一个单位圆,通过生成[0,1]区间内的二维随机值,在单位正方形里进行采样,并通过落在圆内和正方形内散点的个数比,计算圆周率。在本例中,将该任务拆分成10个子任务,每个任务都设置为普通任务。后者利用遗传算法计算出一个目标函数最优的投资组合,由于遗传算法是随机算法,每次运行结果不相同,因此在本例中将该任务拆分成3个重复执行子任务,并选取目标函数最优组合作为解,每个任务设置为耗CPU任务。
下面,详细描述一下处理步骤:
在步骤S1中,创建一个基于耗CPU模式的派发策略的CAnyCPUScheduler,启动5个工作线程。线程池状态为正常(Normal),此时任务队列为空,阻塞等待任务队列非空信号。
在步骤S2中,对10个计算圆周率的子任务进行任务配置。它们的任务优先级都是中级,任务状态都是任务等待中TASK_WAITING,任务类型都是普通任务。由于10个子任务执行完毕后还需要进行结果求平均操作,因此对每个任务设置插槽函数Average()。该函数负责累加每个子任务计算的结果,并在子任务完成个数等于10的时候,对累加结果除以10,求得平均数作为最终圆周率结果。由于子任务之间没有需要保护的共享数据,所以锁设置为读锁,线程之间不存在阻塞。
在步骤S3中,将10个计算圆周率的子任务,加入到线程池的请求队列,如图4(a)所示。
在步骤S4中,请求队列发出非空信号,CAnyCPUScheduler进行按照耗CPU模式进行任务派发。由于线程池状态为正常(Normal),5个工作线程直接执行5个子任务,另外5个子任务还在请求队列等待执行。正在执行的5个子任务状态修改为任务执行中(TASK_EXECUTING),如图4(b)所示。
在步骤S5中,对3个计算投资组合的子任务进行任务配置。它们的任务优先级都是高,任务状态都是任务等待中(TASK_WAITING),任务类型都是耗CPU任务。由于3个子任务执行完毕后还需要取一个最优结果,因此对每个任务设置插槽函数Max()。该函数负责维护最优投资组合,如果历史最优投资组合目标函数值小于当前投资组合目标函数值,则对最优投资组合进行更新,否则不更新。执行完3个子任务后返回最优投资组合。由于子任务之间没有需要保护的共享数据,所以锁设置为读锁,线程之间不存在阻塞。
在步骤S6中,将3个计算投资组合的子任务,加入到线程池的请求队列。此时,请求队列目前有5个计算圆周率子任务,3个计算投资组合子任务,工作线程正在并发执行5个计算圆周率子任务,如图4(c)所示。
在步骤S7中,某一个工作线程计算圆周率子任务执行完毕,调用插槽函数Average(),累加结果值。然后工作线程将该任务状态设置为任务结束中TASK_ENDING,并从任务队列中获取新任务,由于计算投资组合子任务优先级较高,所以工作线程获取了一个计算投资组合子任务,将其状态设置为任务执行中TASK_EXECUTING,并开始执行,由于该任务为耗CPU任务,因此同时将线程池状态设置为CPU忙碌,如图4(d)所示。
在步骤S8中,另一个工作线程计算圆周率子任务执行完毕,调用插槽函数Average(),累加结果值。然后工作线程将该任务状态设置为任务结束中(TASK_ENDING),并从任务队列中获取新任务,由于计算投资组合子任务优先级较高,所以工作线程获取了一个计算投资组合子任务,但由于线程池状态为CPU忙碌,且该任务为耗CPU任务,按照派发策略,该任务被放入耗CPU任务栈。工作线程获取下一个任务,同样是耗CPU任务,同样放入耗CPU任务栈。接下来,工作线程获取到计算圆周率任务,该任务为普通任务,工作线程开始执行该任务,如图4(e)所示。
在步骤S9中,计算圆周率的工作线程陆续执行任务完毕,并调用插槽函数Average(),累加结果值。当第10个计算圆周率子任务执行完毕后,Average()函数将结果值除以10的到最终圆周率的结果。
在步骤S10中,计算投资组合子任务的工作线程执行任务完毕,并调用插槽函数Average(),更新最有投资组合,线程池状态为正常(Normal),并把耗CPU任务栈中的任务弹出,工作线程获取一个任务,开始执行,并重新将线程池状态设置为CPU忙碌,如图4(f)所示。
在步骤S11中,第二个计算投资组合子任务的工作线程执行任务完毕,并调用插槽函数Average(),更新最有投资组合,线程池状态为正常(Normal),并把耗CPU任务栈中的任务弹出,工作线程获取最后一个任务,开始执行,并重新将线程池状态设置为CPU忙碌。
在步骤S12中,第三个计算投资组合子任务的工作线程执行任务完毕,并调用插槽函数Average(),更新最有投资组合并返回。
综上所述,针对现有多线程并发系统在任务调度方面的功能较单一,任务配置灵活性较低的不足,本发明实施例的多线程并发系统通过引入任务描述、锁策略、派发策略、线程池四个模块,支持任务在多线程执行时多种策略的任务调度,针对耗内存任务、耗CPU任务和耗物理IO任务给出了不同的优化措施,支持使用读锁、写锁、常规锁和基于超时的锁进行并发控制。另外,还支持基于插槽机制的任务协作,可以把函数执行的顺序以插槽的方式串联起来,增加灵活性,在派发策略、锁机制方面,普遍使用了基于模板的技术,增强了系统的可扩展性。利用本发明的多线程并发系统可以充分发挥计算机的性能,灵活配置复杂任务的派发策略,提高任务的执行效率。
虽然本发明所揭露的实施方式如上,但所述的内容只是为了便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属技术领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式上及细节上作任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。
Claims (10)
1.一种多线程并发系统,包括:
任务拆分模块,其将待执行任务分割成多个任务;
任务配置模块,其对分割后的每个任务进行属性配置;
线程池模块,其根据每个任务的属性建立相应类型的线程池,并对多个任务执行多线程并发处理。
2.根据权利要求1所述的系统,其特征在于,
所述任务配置模块包括:
任务描述单元,其对分割后的每个任务进行描述进而确定每个任务的任务属性;
锁策略单元,其设置每个任务的锁类型,进而在多线程并发处理时控制线程之间以何种方式阻塞其他线程;
派发策略单元,其确定每个任务的派发模式,并针对不同的派发模式确定相应的派发策略;
进一步所述线程池模块根据每个任务的任务属性、锁类型和派发策略,建立相应类型的线程池,并对多个任务执行多线程并发处理。
3.根据权利要求2所述的系统,其特征在于,所述任务属性包括任务ID、任务优先级、任务状态、任务类型和任务所属工作线程。
4.根据权利要求2或3所述的系统,其特征在于,
所述任务描述单元采用插槽机制将多个任务之间的函数串联起来执行。
5.根据权利要求2~4中任一项所述的系统,其特征在于,
所述锁类型包括读锁、写锁、常规锁和基于超时的锁。
6.根据权利要求2~5中任一项所述的系统,其特征在于,
所述任务类型包括耗内存任务、耗CPU任务、耗物理IO任务和常规型任务;
所述派发模式包括耗内存任务派发、耗CPU任务派发和耗物理IO任务派发,所述线程池包括内存类型线程池、CPU类型线程池和物理IO类型线程池。
7.根据权利要求6所述的系统,其特征在于,在所述多个任务包括耗内存任务、耗CPU任务和耗物理IO任务中的任意之一特殊型任务以及常规型任务时,
所述线程池模块建立与该特殊性任务对应的线程池并采用相应的派发策略来执行线程并发处理。
8.根据权利要求7所述的系统,其特征在于,
所述线程池模块建立了内存类型线程池后,当所述内存类型线程池中已经存在一个耗内存任务正在执行时,所述线程池模块不并发执行其他耗内存任务而对常规型任务执行线程并发处理。
9.根据权利要求7所述的系统,其特征在于,
所述线程池模块建立了CPU类型线程池后,当所述CPU类型线程池中已经存在一个耗CPU任务正在执行时,所述线程池模块不并发执行其他耗CPU任务而对常规型任务执行线程并发处理。
10.根据权利要求7所述的系统,其特征在于,
所述线程池模块建立了物理IO类型线程池后,当所述物理IO类型线程池中已经存在一个耗物理IO任务正在执行时,所述线程池模块不并发执行其他耗物理IO任务而对常规型任务执行线程并发处理。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510373314.0A CN106325980A (zh) | 2015-06-30 | 2015-06-30 | 一种多线程并发系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510373314.0A CN106325980A (zh) | 2015-06-30 | 2015-06-30 | 一种多线程并发系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN106325980A true CN106325980A (zh) | 2017-01-11 |
Family
ID=57722354
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510373314.0A Pending CN106325980A (zh) | 2015-06-30 | 2015-06-30 | 一种多线程并发系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106325980A (zh) |
Cited By (35)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106909461A (zh) * | 2017-02-21 | 2017-06-30 | 杭州天宽科技有限公司 | 一种单线程模拟多线程的方法 |
CN107450971A (zh) * | 2017-06-29 | 2017-12-08 | 北京五八信息技术有限公司 | 任务处理方法及装置 |
CN107577454A (zh) * | 2017-09-25 | 2018-01-12 | 四川长虹电器股份有限公司 | 一种基于python的应用程序多线程运行优化方法 |
CN107577525A (zh) * | 2017-08-22 | 2018-01-12 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN107908425A (zh) * | 2017-11-16 | 2018-04-13 | 中国银行股份有限公司 | 一种配置化文件的生成方法及系统 |
CN108053288A (zh) * | 2017-12-26 | 2018-05-18 | 杭州东方通信软件技术有限公司 | 一种业务编排下发的方法及装置 |
CN108121792A (zh) * | 2017-12-20 | 2018-06-05 | 第四范式(北京)技术有限公司 | 基于任务并行处理数据流的方法、装置、设备及存储介质 |
CN108234242A (zh) * | 2017-12-29 | 2018-06-29 | 北京奇虎科技有限公司 | 一种基于流的压力测试方法和装置 |
CN108762913A (zh) * | 2018-03-23 | 2018-11-06 | 阿里巴巴集团控股有限公司 | 服务处理方法及装置 |
CN108931526A (zh) * | 2018-05-28 | 2018-12-04 | 中冶南方工程技术有限公司 | 基于多任务调度机制的带钢表面缺陷检测方法 |
CN108958896A (zh) * | 2018-06-16 | 2018-12-07 | 温州职业技术学院 | 多线程并发处理系统及方法 |
CN109214180A (zh) * | 2017-06-30 | 2019-01-15 | 武汉斗鱼网络科技有限公司 | 一种内存代码的校验方法及装置 |
CN109246470A (zh) * | 2018-09-29 | 2019-01-18 | 武汉斗鱼网络科技有限公司 | 多线程同步的弹幕分发方法、装置、设备及存储介质 |
CN109308214A (zh) * | 2017-07-27 | 2019-02-05 | 北京京东尚科信息技术有限公司 | 数据任务处理方法和系统 |
CN109783242A (zh) * | 2018-12-12 | 2019-05-21 | 平安科技(深圳)有限公司 | 海外控股估值流程控制方法、装置、计算机设备及存储介质 |
CN109874027A (zh) * | 2019-03-11 | 2019-06-11 | 宸瑞普惠(广州)科技有限公司 | 一种低延时手术示教直播方法及其系统 |
CN109976895A (zh) * | 2019-04-09 | 2019-07-05 | 苏州浪潮智能科技有限公司 | 一种数据库的多任务并发处理方法和装置 |
CN109992359A (zh) * | 2019-03-28 | 2019-07-09 | 深圳市创联时代科技有限公司 | 一种事务调度方法 |
CN110322569A (zh) * | 2019-07-03 | 2019-10-11 | 百度在线网络技术(北京)有限公司 | 多模态ar处理方法、装置、设备和可读存储介质 |
CN110347427A (zh) * | 2019-07-08 | 2019-10-18 | 北京明略软件系统有限公司 | 网页代码的优化方法及装置 |
CN110618857A (zh) * | 2019-08-14 | 2019-12-27 | 中国电力科学研究院有限公司 | 一种校准平台的多任务测控方法、以及资源分配方法 |
CN110659123A (zh) * | 2019-11-29 | 2020-01-07 | 中国人民解放军国防科技大学 | 一种基于消息的分布式任务分发调度方法及装置 |
CN110795222A (zh) * | 2019-10-25 | 2020-02-14 | 北京浪潮数据技术有限公司 | 一种多线程任务调度方法、装置、设备及可读介质 |
CN110837428A (zh) * | 2018-08-16 | 2020-02-25 | 杭州海康威视系统技术有限公司 | 存储设备管理方法及装置 |
CN111124697A (zh) * | 2020-01-02 | 2020-05-08 | 中国航空工业集团公司西安航空计算技术研究所 | 面向分布式平台的任务同步和执行方法 |
CN111143065A (zh) * | 2019-12-25 | 2020-05-12 | 杭州安恒信息技术股份有限公司 | 一种数据处理方法、装置、设备及介质 |
CN111309458A (zh) * | 2019-07-12 | 2020-06-19 | 北京关键科技股份有限公司 | 一种多节点任务异步协同处理方法 |
CN111538491A (zh) * | 2020-04-24 | 2020-08-14 | 成都新致云服信息技术有限公司 | 数据事件处理方法、装置、设备和存储介质 |
CN113051175A (zh) * | 2021-04-19 | 2021-06-29 | 杭州至千哩科技有限公司 | 一种可扩展的通用工作流框架系统 |
CN113722067A (zh) * | 2021-08-24 | 2021-11-30 | 咪咕音乐有限公司 | 信息任务调度方法、装置、设备及存储介质 |
CN113792051A (zh) * | 2021-09-17 | 2021-12-14 | 河北幸福消费金融股份有限公司 | 基于多模态锁的数据处理方法、系统、设备和存储介质 |
CN115016948A (zh) * | 2022-08-08 | 2022-09-06 | 阿里巴巴(中国)有限公司 | 一种资源访问方法、装置、电子设备及可读存储介质 |
CN115185677A (zh) * | 2022-06-24 | 2022-10-14 | 湖南长银五八消费金融股份有限公司 | 业务数据合并总账方法、装置、计算机设备及介质 |
CN115202884A (zh) * | 2022-07-26 | 2022-10-18 | 江苏安超云软件有限公司 | 基于轮询的高性能系统的加解读写锁的方法及应用 |
CN111752971B (zh) * | 2017-12-20 | 2024-06-28 | 第四范式(北京)技术有限公司 | 基于任务并行处理数据流的方法、装置、设备及存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103246552A (zh) * | 2012-02-14 | 2013-08-14 | 腾讯科技(深圳)有限公司 | 防止线程出现阻塞的方法和装置 |
CN102541653B (zh) * | 2010-12-24 | 2013-12-25 | 新奥特(北京)视频技术有限公司 | 一种多任务线程池调度方法和系统 |
CN104133724A (zh) * | 2014-04-03 | 2014-11-05 | 腾讯科技(深圳)有限公司 | 并发任务调度方法及装置 |
-
2015
- 2015-06-30 CN CN201510373314.0A patent/CN106325980A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102541653B (zh) * | 2010-12-24 | 2013-12-25 | 新奥特(北京)视频技术有限公司 | 一种多任务线程池调度方法和系统 |
CN103246552A (zh) * | 2012-02-14 | 2013-08-14 | 腾讯科技(深圳)有限公司 | 防止线程出现阻塞的方法和装置 |
CN104133724A (zh) * | 2014-04-03 | 2014-11-05 | 腾讯科技(深圳)有限公司 | 并发任务调度方法及装置 |
Non-Patent Citations (4)
Title |
---|
帖军,: "分布式线程池模型的设计与实现", 《中南民族大学学报(自然科学版)》 * |
熊茂华,等主编,: "《ARM9嵌入式系统设计与开发应用 2008年1月第1版》", 31 January 2008, 清华大学出版社, * |
胡铮主编,: "《数据库管理2006年1月第1版》", 31 January 2006, 华夏出版社 * |
黄智泉,等;: "基于平均时间的线程池尺寸自适应调整算法", 《计算机技术与发展》 * |
Cited By (51)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106909461A (zh) * | 2017-02-21 | 2017-06-30 | 杭州天宽科技有限公司 | 一种单线程模拟多线程的方法 |
CN107450971B (zh) * | 2017-06-29 | 2021-01-29 | 北京五八信息技术有限公司 | 任务处理方法及装置 |
CN107450971A (zh) * | 2017-06-29 | 2017-12-08 | 北京五八信息技术有限公司 | 任务处理方法及装置 |
CN109214180A (zh) * | 2017-06-30 | 2019-01-15 | 武汉斗鱼网络科技有限公司 | 一种内存代码的校验方法及装置 |
CN109308214A (zh) * | 2017-07-27 | 2019-02-05 | 北京京东尚科信息技术有限公司 | 数据任务处理方法和系统 |
CN107577525A (zh) * | 2017-08-22 | 2018-01-12 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN107577525B (zh) * | 2017-08-22 | 2020-11-17 | 努比亚技术有限公司 | 一种创建并发线程的方法、装置及计算机可读存储介质 |
CN107577454A (zh) * | 2017-09-25 | 2018-01-12 | 四川长虹电器股份有限公司 | 一种基于python的应用程序多线程运行优化方法 |
CN107908425A (zh) * | 2017-11-16 | 2018-04-13 | 中国银行股份有限公司 | 一种配置化文件的生成方法及系统 |
CN111752971A (zh) * | 2017-12-20 | 2020-10-09 | 第四范式(北京)技术有限公司 | 基于任务并行处理数据流的方法、装置、设备及存储介质 |
CN108121792A (zh) * | 2017-12-20 | 2018-06-05 | 第四范式(北京)技术有限公司 | 基于任务并行处理数据流的方法、装置、设备及存储介质 |
CN108121792B (zh) * | 2017-12-20 | 2020-06-26 | 第四范式(北京)技术有限公司 | 基于任务并行处理数据流的方法、装置、设备及存储介质 |
CN111752971B (zh) * | 2017-12-20 | 2024-06-28 | 第四范式(北京)技术有限公司 | 基于任务并行处理数据流的方法、装置、设备及存储介质 |
CN108053288B (zh) * | 2017-12-26 | 2020-10-02 | 杭州东方通信软件技术有限公司 | 一种业务编排下发的方法及装置 |
CN108053288A (zh) * | 2017-12-26 | 2018-05-18 | 杭州东方通信软件技术有限公司 | 一种业务编排下发的方法及装置 |
CN108234242A (zh) * | 2017-12-29 | 2018-06-29 | 北京奇虎科技有限公司 | 一种基于流的压力测试方法和装置 |
CN108762913A (zh) * | 2018-03-23 | 2018-11-06 | 阿里巴巴集团控股有限公司 | 服务处理方法及装置 |
CN108931526B (zh) * | 2018-05-28 | 2021-02-09 | 中冶南方工程技术有限公司 | 基于多任务调度机制的带钢表面缺陷检测方法 |
CN108931526A (zh) * | 2018-05-28 | 2018-12-04 | 中冶南方工程技术有限公司 | 基于多任务调度机制的带钢表面缺陷检测方法 |
CN108958896A (zh) * | 2018-06-16 | 2018-12-07 | 温州职业技术学院 | 多线程并发处理系统及方法 |
CN110837428B (zh) * | 2018-08-16 | 2023-09-19 | 杭州海康威视系统技术有限公司 | 存储设备管理方法及装置 |
CN110837428A (zh) * | 2018-08-16 | 2020-02-25 | 杭州海康威视系统技术有限公司 | 存储设备管理方法及装置 |
CN109246470B (zh) * | 2018-09-29 | 2020-10-16 | 武汉斗鱼网络科技有限公司 | 多线程同步的弹幕分发方法、装置、设备及存储介质 |
CN109246470A (zh) * | 2018-09-29 | 2019-01-18 | 武汉斗鱼网络科技有限公司 | 多线程同步的弹幕分发方法、装置、设备及存储介质 |
CN109783242A (zh) * | 2018-12-12 | 2019-05-21 | 平安科技(深圳)有限公司 | 海外控股估值流程控制方法、装置、计算机设备及存储介质 |
CN109874027A (zh) * | 2019-03-11 | 2019-06-11 | 宸瑞普惠(广州)科技有限公司 | 一种低延时手术示教直播方法及其系统 |
CN109992359A (zh) * | 2019-03-28 | 2019-07-09 | 深圳市创联时代科技有限公司 | 一种事务调度方法 |
CN109976895A (zh) * | 2019-04-09 | 2019-07-05 | 苏州浪潮智能科技有限公司 | 一种数据库的多任务并发处理方法和装置 |
CN110322569A (zh) * | 2019-07-03 | 2019-10-11 | 百度在线网络技术(北京)有限公司 | 多模态ar处理方法、装置、设备和可读存储介质 |
CN110347427A (zh) * | 2019-07-08 | 2019-10-18 | 北京明略软件系统有限公司 | 网页代码的优化方法及装置 |
CN111309458A (zh) * | 2019-07-12 | 2020-06-19 | 北京关键科技股份有限公司 | 一种多节点任务异步协同处理方法 |
CN110618857A (zh) * | 2019-08-14 | 2019-12-27 | 中国电力科学研究院有限公司 | 一种校准平台的多任务测控方法、以及资源分配方法 |
CN110795222B (zh) * | 2019-10-25 | 2022-03-22 | 北京浪潮数据技术有限公司 | 一种多线程任务调度方法、装置、设备及可读介质 |
CN110795222A (zh) * | 2019-10-25 | 2020-02-14 | 北京浪潮数据技术有限公司 | 一种多线程任务调度方法、装置、设备及可读介质 |
CN110659123B (zh) * | 2019-11-29 | 2020-03-20 | 中国人民解放军国防科技大学 | 一种基于消息的分布式任务分发调度方法及装置 |
CN110659123A (zh) * | 2019-11-29 | 2020-01-07 | 中国人民解放军国防科技大学 | 一种基于消息的分布式任务分发调度方法及装置 |
CN111143065A (zh) * | 2019-12-25 | 2020-05-12 | 杭州安恒信息技术股份有限公司 | 一种数据处理方法、装置、设备及介质 |
CN111143065B (zh) * | 2019-12-25 | 2023-08-22 | 杭州安恒信息技术股份有限公司 | 一种数据处理方法、装置、设备及介质 |
CN111124697A (zh) * | 2020-01-02 | 2020-05-08 | 中国航空工业集团公司西安航空计算技术研究所 | 面向分布式平台的任务同步和执行方法 |
CN111124697B (zh) * | 2020-01-02 | 2023-09-08 | 中国航空工业集团公司西安航空计算技术研究所 | 面向分布式平台的任务同步和执行方法 |
CN111538491B (zh) * | 2020-04-24 | 2023-07-14 | 成都新致云服信息技术有限公司 | 数据事件处理方法、装置、设备和存储介质 |
CN111538491A (zh) * | 2020-04-24 | 2020-08-14 | 成都新致云服信息技术有限公司 | 数据事件处理方法、装置、设备和存储介质 |
CN113051175A (zh) * | 2021-04-19 | 2021-06-29 | 杭州至千哩科技有限公司 | 一种可扩展的通用工作流框架系统 |
CN113722067A (zh) * | 2021-08-24 | 2021-11-30 | 咪咕音乐有限公司 | 信息任务调度方法、装置、设备及存储介质 |
CN113792051B (zh) * | 2021-09-17 | 2023-08-25 | 河北幸福消费金融股份有限公司 | 基于多模态锁的数据处理方法、系统、设备和存储介质 |
CN113792051A (zh) * | 2021-09-17 | 2021-12-14 | 河北幸福消费金融股份有限公司 | 基于多模态锁的数据处理方法、系统、设备和存储介质 |
CN115185677A (zh) * | 2022-06-24 | 2022-10-14 | 湖南长银五八消费金融股份有限公司 | 业务数据合并总账方法、装置、计算机设备及介质 |
CN115202884B (zh) * | 2022-07-26 | 2023-08-22 | 江苏安超云软件有限公司 | 基于轮询的高性能系统的加解读写锁的方法及应用 |
CN115202884A (zh) * | 2022-07-26 | 2022-10-18 | 江苏安超云软件有限公司 | 基于轮询的高性能系统的加解读写锁的方法及应用 |
CN115016948B (zh) * | 2022-08-08 | 2022-11-25 | 阿里巴巴(中国)有限公司 | 一种资源访问方法、装置、电子设备及可读存储介质 |
CN115016948A (zh) * | 2022-08-08 | 2022-09-06 | 阿里巴巴(中国)有限公司 | 一种资源访问方法、装置、电子设备及可读存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106325980A (zh) | 一种多线程并发系统 | |
US11797348B2 (en) | Hierarchical task scheduling in a multi-threaded processing system | |
Hutter et al. | Parallel algorithm configuration | |
CN102270159B (zh) | 一种虚拟化环境中的准入控制与负载均衡方法 | |
US6687729B1 (en) | System and method for providing a pool of reusable threads for performing queued items of work | |
CN105320561B (zh) | 任务管理方法和系统 | |
CN106293950B (zh) | 一种面向集群系统的资源优化管理方法 | |
CN110362407A (zh) | 计算资源调度方法及装置 | |
US20100269110A1 (en) | Executing tasks through multiple processors consistently with dynamic assignments | |
DE102012220267B4 (de) | Rechenarbeitsverteilungs - Referenzzähler | |
JPH10500505A (ja) | データ管理システム | |
Bergman et al. | Parallel combinatorial optimization with decision diagrams | |
US20100153962A1 (en) | Method and system for controlling distribution of work items to threads in a server | |
CN108123980A (zh) | 一种资源调度方法及系统 | |
CN107329822B (zh) | 面向多源多核系统的基于超任务网的多核调度方法 | |
CN106681820A (zh) | 基于消息组合的可扩展大数据计算方法 | |
CN110308982A (zh) | 一种共享内存复用方法及装置 | |
Canon et al. | Online scheduling of task graphs on heterogeneous platforms | |
CN111459622A (zh) | 调度虚拟cpu的方法、装置、计算机设备和存储介质 | |
CN108595259A (zh) | 一种基于全局管理的内存池管理方法 | |
CN103959276A (zh) | 基于用户意图和进程独立性的知识的资源分配优先化 | |
Kriemann | Implementation and Usage of a Thread Pool based on POSIX Threads | |
CN116010116B (zh) | 一种基于云计算的多线程数据处理方法 | |
Zhao et al. | Work structure based collaborative engineering design | |
Nasrallah et al. | Enhanced Heuristic Method for Scheduling and Leveling Using Heuristic Indices |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20170111 |