一种基于信号量的线程池共享方法及系统与流程

文档序号:11829198阅读:376来源:国知局
一种基于信号量的线程池共享方法及系统与流程

本发明涉及计算机技术领域,尤其涉及一种基于信号量的线程池共享方法及系统。



背景技术:

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但必须等到其他线程完成后才能启动。

虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。在使用线程池时需注意线程池大小与性能的关系,注意并发风险、死锁、资源不足和线程泄漏等问题。

目前,线程池的使用均为独立的,并不存在共享的情况。而且线程池只针对某一类功能提供,而这种方式的缺陷是线程池的独立使用,使得处理器内存资源不能得到有效利用。



技术实现要素:

针对现有技术的缺陷,本发明提供一种基于信号量的线程池共享方法及系统,通过信号量控制的方式,通过适当的调度,使线程池在逻辑上成为一个整体,从而能够为多类功能提供线程池服务,使得处理器的内存资源得到有效的利用。

第一方面,本发明提供一种基于信号量的线程池共享方法,所述 方法包括:

当接收到包括线程池标识的功能请求后,判断系统的所有线程池中是否存在请求队列为空的线程池;

若存在请求队列为空的线程池,则利用所述线程池执行所述功能请求的任务;

若不存在请求队列位空的线程池,则将所述功能请求加入所述线程池标识对应的线程池的请求队列。

优选地,所述当接收到包括线程池标识的功能请求后,判断系统的所有线程池中是否存在请求队列为空的线程池的步骤前,所述方法还包括:

建立多个线程池;

为每个线程池生成线程池标识,为每个线程池申请一个与所述线程池容量相等的信号量,并为每个线程池建立一个请求队列。

优选地,所述判断系统的所有线程池中是否存在请求队列为空的线程池,包括:

根据线程池的信号量的值,判断系统的所有线程池中是否存在请求队列为空的线程池。

优选地,所述判断系统的所有线程池中是否存在请求队列为空的线程池,包括:

判断线程池的信号量是否为0,若所述线程池的信号量不为0,则所述线程池的请求队列为空;若所述线程池的信号量为0,则所述线程池的请求队列不为空。

优选地,所述方法还包括:

对所有线程池的请求队列进行检测,若检测到请求队列为空的线程池,则将请求队列最长的线程池中的任一未运行的任务出队,利用所述请求队列为空的线程池处理所述任务。

第二方面,本发明提供了一种基于信号量的线程池共享系统,所述系统包括:

判断模块,用于当接收到包括线程池标识的功能请求后,判断系统的所有线程池中是否存在请求队列为空的线程池;

执行模块,用于当存在请求队列为空的线程池时,利用所述线程池执行所述功能请求的任务;

入队模块,用于当不存在请求队列位空的线程池时,则将所述功能请求加入所述线程池标识对应的线程池的请求队列。

优选地,所述系统还包括:

预设模块,用于建立多个线程池;为每个线程池生成线程池标识,为每个线程池申请一个与所述线程池容量相等的信号量,并为每个线程池建立一个请求队列。

优选地,所述判断模块,具体用于:

根据线程池的信号量的值,判断系统的所有线程池中是否存在请求队列为空的线程池。

优选地,所述判断模块,具体用于:

判断线程池的信号量是否为0,若所述线程池的信号量不为0,则所述线程池的请求队列为空;若所述线程池的信号量为0,则所述线程池的请求队列不为空。

优选地,所述系统还包括:

检测模块,用于对所有线程池的请求队列进行检测,若检测到请求队列为空的线程池,则将请求队列最长的线程池中的任一未运行的任务出队,利用所述请求队列为空的线程池处理所述任务。

由上述技术方案可知,本发明提供一种基于信号量的线程池共享方法及系统,通过信号量控制的方式,通过适当的调度,使线程池在逻辑上成为一个整体,从而能够为多类功能提供线程池服务,使得处理器的内存资源得到有效的利用。本发明充分利用计算机的处理资源,在处理并发任务时,能够均衡地分配各功能资源,而且能够根据功能的有无,能够选择是否加载线程池,使得系统更加灵活。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些图获得其他的附图。

图1是本发明一实施例提供的一种基于信号量的线程池共享方法的流程示意图;

图2是本发明另一实施例提供的一种基于信号量的线程池共享方系统的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

如图1所示,本发明一实施例提供了一种基于信号量的线程池共享方法,该方法包括如下步骤:

S1:当接收到包括线程池标识的功能请求后,判断系统的所有线程池中是否存在请求队列为空的线程池;

S2:若存在请求队列为空的线程池,则利用所述线程池执行所述功能请求的任务;

S3:若不存在请求队列位空的线程池,则将所述功能请求加入所述线程池标识对应的线程池的请求队列。

本实施例中,首先搜索请求队列为空的线程池,如果存在未处理任何任务的线程池,则直接执行请求的任务,如果所有线程池均有功能请求在被处理,即将该功能请求送入标识对应的原线程池服务提供 者队列,入队。由此可见,该方法可以有效提高系统的效率,使得系统更为灵活,

需要说明的是,步骤S1中接收到的功能请求绑定了线程池标识,用于识别该功能的原线程池服务提供者。

本实施例中,在步骤S1之前,该方法还包括如下步骤:

建立多个线程池;为每个线程池生成线程池标识,为每个线程池申请一个与所述线程池容量相等的信号量,并为每个线程池建立一个请求队列。

其中,建立的多个线程池可以根据需要为功能提供相应的服务,但并不要求线程池的实现方法相同。

需要说明的是,线程池容量是指线程池中线程的多少,设置信号量与线程池容量大小相等,则每当一个线程被占用,则信号量的值减一,当某个线程被释放,信号量的值加一。则当信号量减至零时,表明线程池中的线程均被占用,则后续的功能请求加入该线程池的请求队列中,等待被处理。

具体来说,当建立上述多个线程池后,系统建立线程池管理工厂,将所有的线程池注册到该工厂中,统一由工厂进行功能请求的响应,从而决定将线程池服务提供给相应的功能。

本实施例中,步骤S1中判断系统中是否存在请求队列为空的线程池,具体包括:

根据线程池的信号量的值,判断系统的所有线程池中是否存在请求队列为空的线程池。

其中,信号量是一个非负整数,所有通过它的线程/进程都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作:Wait(等待)和Release(释放)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。

本实施例中,举例来说,判断线程池的信号量是否为0,若所述线程池的信号量不为0,则所述线程池的请求队列为空;若所述线程池的信号量为0,则所述线程池的请求队列不为空。

本实施例中,该方法还包括如下步骤:

对所有线程池的请求队列进行检测,若检测到请求队列为空的线程池,则将请求队列最长的线程池中的任一未运行的任务出队,利用所述请求队列为空的线程池处理所述任务。

通过该步骤,可以使得任务均衡地分配给多个线程池,使得系统处理功能请求的效率更进一步地提高。

本实施例提供了一种基于信号量的线程池共享方法,通过信号量控制的方式,通过适当的调度,使线程池在逻辑上成为一个整体,从而能够为多类功能提供线程池服务,使得处理器的内存资源得到有效的利用。

而且本实施例充分利用计算机的处理资源,在处理并发任务时,能够均衡地分配各功能资源。这种共享方法使系统中逻辑上仅存在一个线程池,但物理上,可以根据功能的有无,能够选择是否加载线程池,使得系统更加灵活。

如图2所示,本发明另一实施例提供了一种基于信号量的线程池共享系统,该系统包括判断模块201、执行模块202及入队模块203。

判断模块201,用于当接收到包括线程池标识的功能请求后,判断系统的所有线程池中是否存在请求队列为空的线程池。

执行模块202,用于当存在请求队列为空的线程池时,利用所述线程池执行所述功能请求的任务。

入队模块203,用于当不存在请求队列位空的线程池时,则将所述功能请求加入所述线程池标识对应的线程池的请求队列。

本实施例中,上述系统还包括:

预设模块,用于建立多个线程池;为每个线程池生成线程池标识,为每个线程池申请一个与所述线程池容量相等的信号量,并为每个线 程池建立一个请求队列。

本实施例中,判断模块201,具体用于:

根据线程池的信号量的值,判断系统的所有线程池中是否存在请求队列为空的线程池。

举例来说,判断线程池的信号量是否为0,若所述线程池的信号量不为0,则所述线程池的请求队列为空;若所述线程池的信号量为0,则所述线程池的请求队列不为空。

本实施例中,该系统还包括:

检测模块,用于对所有线程池的请求队列进行检测,若检测到请求队列为空的线程池,则将请求队列最长的线程池中的任一未运行的任务出队,利用所述请求队列为空的线程池处理所述任务。

以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解;其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1