手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 摘要:在各种业务解决方案的设计中,服务器处理任务的效率是衡量方案优劣的一个重要标准。使用多线程技术并发处理任务是提高服务器效率的一个主要手段。但是频繁的线程创建、销毁和任务的分配也会降低系统效率。本文设计了一个通用的线程池,根据不同服务器所处理的任务的特点,能够配置对应的线程池参数,最大幅度的提高系统性能。

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

  概述

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

  线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量(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] 下一页

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS