3-13卓跃教育_线程封装.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3-13卓跃教育_线程封装

第十三章 线程封装 本章内容 线程池基本概念 线程池组成部分 线程池工作原理 线程池设计注意点 任务的通用性 线程创建和销毁策略 任务分配策略 线程池基本概念 线程池是预先创建线程的一种技术。线程池在任务还没有到来之前,创建一定数量(N)的线程,放入空闲队列中。这些线程都是处于阻塞(Suspended)状态,不消耗CPU,但占用较小的内存空间。 当新任务到来时,缓冲池选择一个空闲线程,把任务传入此线程中运行;如果缓冲池已经没有空闲线程,则新建若干个线程。当系统比较空闲时,大部分线程都一直处于暂停状态,线程池自动销毁一部分线程,回收系统资源。 线程池组成部分 线程池类 维护工作者线程队列(包括空闲与忙碌队列) 维护一个任务队列 维护一个线程池调度器指针 线程池调度器(本身也是一个线程) 负责线程调度 负责任务分配 工作者线程类(线程池中的线程类的封装) 任务队列 任务接口(实际的业务逻辑都继承自该接口) 线程池工作原理3-1 线程池类至少提供三个接口,初始化线程池、销毁线程池、添加任务接口 初始化线程池 开启线程池调度器线程 预先创建N个线程(由线程调度池器类负责创建线工作者线程),放入空闲线程队列 指定最大的忙碌状态的线程数 销毁线程池 释放空闲队列中的线程与工作状态中的线程 释放调度器线程 添加任务 添加一实际任务,但是并没有立刻运行该任务,只是放入任务队列,由线程池调度器从任务队列获取该任务,并从线程池中获得一个线程来运行该任务,这里实际上是一种生产者消费者模型。 线程池工作原理3-2 线程池调度器包含创建空闲线程、销毁空闲线程接口 线程池调度器本身也是一个线程,主要负责任务调度与线程调度,其工作过程大致如下: 从任务队列获取任务,如果队列为空,阻塞等待新任务到来 队列不为空,取出该任务,从空闲线程队列取一线程,如果为空,判断工作者线程数是否达到上限,如果没有,则创建若个空闲线程,否则等待某一任务执行完毕,并且该任务对应的线程归还给线程池 获得空闲工作者线程,将任务交给工作者线程来处理,工作者线程维护一任务指针,这里只要该指针指向任务,并且唤醒线程 判断空闲工作者线程数是否超过最大工作者线程数,如果超过,销毁(空闲线程数-允许最大空闲线程数)个线程 线程池工作原理3-3 任务接口是一个抽象类,只有一个虚函数run方法,执行的是实际的业务逻辑 工作者线程维护一任务指针,工作者线程的任务主要是运行任务对象的run方法。 当线程池调度器调度一个工作者线程后,就唤醒工作者线程,并调用run方法来执行实际的业务逻辑,当run方法执行完毕,即业务逻辑处理结束,将工作者线程归还到空闲线程池队列,而不是销毁。这样线程池调度器下一次就有机会调度到该工作者线程。 线程池设计注意点 任务的通用性 线程创建和销毁策略 任务分配策略 任务的通用性2-1 不同的业务解决方案有各自独特的任务处理方法,任务的划分上也就千差万别。为了使得在处理任务对象的时候达到一定程度的通用性,任务对象的设计上必须与实际任务的处理逻辑完全无关。从任务执行的角度看,任务不过是处理流程的一次或者多次执行的过程,可以这样来定义如下任务接口 class ITask { virtual bool run() = 0; } 任务的通用性2-2 任务在其需要的时候才创建。任务的创建通过new操作,动态创建具体的任务对象,然后传入线程池,由线程池自动分配线程来执行此任务。 任务是否执行完毕由其自身来决定。一个未知任务什么时候执行完毕是不可能预测的,必须任务本身来决定。这个策略通过,run()的返回值来实现。当工作线程执行一次任务时,如果返回值为true,表示任务执行完毕,就用delete操作销毁此任务;如果返回值为false,表示任务需要执行的工作并未完成,继续执行此任务。 这样的策略,使得在设计新的任务处理流程的时候,不需要过多的关心任务的接口规范,只需要在新任务类的构造函数中初始化各种资源,在新任务类的析构函数中回收资源,在run()方法中实现主要的处理逻辑,那么新的任务类即可在线程池中执行。 线程创建和销毁策略 在缓冲池刚刚建立时,线程池中有一定数量(N1)的已创建好的线程,这样可以使得新任务可以及时的得到执行。估计出平均情况下,一次业务产生的任务数量N2。那么N1应该是N2的整数倍,N1=N2×n1 在线程缓冲池中的所有线程都处于繁忙状态的时候,线程池就会创建新的线程,设创建N2个。由以上分析,为了减少由于线程不够而再创建线程的概率,N3也应该是N2的整数倍,N3=N2×n2。 当服务器业务减少,出现大量线程闲置的情况,就应该销毁一部分线程。很显然,这里应该使用超时策略,当某些线程在超过时间T仍然处于闲置状态,就销毁一部分空闲线程。设销毁N4个空闲线程,为了减

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档