利用C 语言设计可扩展线程池

2008-02-23 05:24:59来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

 摘要:在各种业务解决方案的设计中,服务器处理任务的效率是衡量方案优劣的一个重要标准。使用多线程技术并发处理任务是提高服务器效率的一个主要手段。但是频繁的线程创建、销毁和任务的分配也会降低系统效率。本文设计了一个通用的线程池,根据不同服务器所处理的任务的特点,能够配置对应的线程池参数,最大幅度的提高系统性能。

  关键字:线程池多线程任务虚函数异常

  概述

  在各种业务解决方案的设计过程中,服务器处理任务的效率往往决定了方案的成败。多线程处理任务是提高服务器效率的主要手段,他提高了对服务器资源的利用,使得任务能够并发处理。但假如服务器处理的任务的特点是轻量级、频率高,那么线程的创建和销毁会很频繁,而系统用于处理线程的创建和销毁的开销会占相当大的比重,反而降低了系统的效率。通过线程池技术,能够减少频繁的线程的创建和销毁对系统性能的影响。

  线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量(N1)的线程,放入空闲队列中。这些线程都是处于阻塞(Suspended)状态,不消耗CPU,但占用较小的内存空间。当任务到来后,缓冲池选择一个空闲线程,把任务传入此线程中运行。当N1个线程都在处理任务后,缓冲池自动创建一定数量的新线程,用于处理更多的任务。当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源。

  通用线程缓冲池的设计,不但要实现上述功能,还要考虑此设计的可移植性,减少重复研发。设计中需要考虑的重点是:
  • 任务对象的通用性;
  • 线程创建和销毁策略;
  • 任务的分配策略。
  分析和设计

  1、任务对象的通用性

  不同的业务解决方案有各自独特的任务处理方法,任务的划分上也就千差万别。为了使得在处理任务对象的时候达到一定程度的通用性,任务对象的设计上必须和实际任务的处理逻辑完全无关。从任务执行的角度看,任务但是是处理流程的一次或多次执行的过程,能够这样来定义任务接口:

class Task

{

public:

Task();

virtual ~Task();

virtual bool run() = 0;

};


  Task类是任何任务类的基类,其中的纯虚函数run()是任务流程的入口,工作线程在处理任务的时候就从此处开始执行任务的处理流程。设计一个新的任务时,只需要继承Task接口,新的任务就能够放入线程池中执行。

  任务的创建、执行和销毁这样来设计:

  (1)任务在其需要的时候才创建。任务的创建通过new操作,动态创建具体的任务对象,然后传入线程池,由线程池自动分配线程来执行此任务。

  (2)任务是否执行完毕由其自身来决定。一个未知任务什么时候执行完毕是不可能预测的,必须任务本身来决定。这个策略通过,Task::run()的返回值来实现。当工作线程执行一次任务时,假如返回值为true,表示任务执行完毕,就用delete操作销毁此任务;假如返回值为false,表示任务需要执行的工作并未完成,继续执行此任务。

  这样的策略,使得在设计新的任务处理流程的时候,无需过多的关心任务的接口规范,只需要在新任务类的构造函数中初始化各种资源,在新任务类的析构函数中回收资源,在run()方法中实现主要的处理逻辑,那么新的任务类即可在线程池中执行。

  2、线程的创建和销毁

  线程缓冲池中的维持的线程数量应该按照任务处理的需求来定。

  在缓冲池刚刚建立时,线程池中有一定数量(N1)的已创建好的线程,这样能够使得新任务能够及时的得到执行。比如,某客户端在向服务器发送登陆请求的时候,这样一个请求使得服务器通常需要创建好几个相互有关联的任务。也就是说,客户端和服务器端的一次交互,通常会产生一定数量的任务。根据一个服务器所处理的业务,估计出平均情况下,一次业务产生的任务数量N2。那么N1应该是N2的整数倍,N1=N2×n1,减少由于线程不够而再创建线程的概率,才能使得服务器在业务处理初期最为高效。

  在线程缓冲池中的任何线程都处于繁忙状态的时候,线程池就会创建新的线程,设创建N3个。由以上分析,为了减少由于线程不够而再创建线程的概率,N3也应该是N2的整数倍,N3=N2×n2。

  当服务器业务减少,出现大量线程闲置的情况,就应该销毁一部分线程。很显然,这里应该使用超时策略,当某些线程在超过时间T仍然处于闲置状态,就销毁一部分空闲线程。设销毁N4个空闲线程,为了减少由于线程不够而再创建线程的概率,N4也应该是N2的整数倍,N4=N2×n3。当然,为了使得新任务及时得到处理,即使服务器一直处于空闲,也应该保留N1个线程。



[1] [2] [3] 下一页

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 深入探讨C 中的引用

下一篇: C 程式设计语言编程风格演变史

热门词条
热门标签