Linux高级环境编程实验报告4.docVIP

  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文档。上传文档
查看更多
Linux高级环境编程实验报告4

作 业 报 告 学生姓名: 学 号: 指导教师: 学生E-mail: 一、作业名称: 多队列线程池的应用 二、作业要求 设计并实现一个整数加法运算的线程池,其中能够接收三种线程:1、用户线程,向线程池(主控线程)提交加法运算请求;2、主控线程,接收用户线程提出的加法运算请求,并负载均衡地将请求下发到若干计算线程;3、若干计算进程,接收来自于主控线程转发的加法计算请求,完成加法计算,并将计算结果直接返回给用户线程。另外,这三种线程都应具有各自的消息队列,来完成加法计算请求的发送与转发,并返回计算结果。具体业务要求: 1)、用户线程需同时向主控线程提出=1000个加法计算请求 2)、用户线程需要验证是否收到了这些加法计算的结果 三、设计与实现 根据作业要求分析,需要设个三中线程,而且三种线程之间还要相互通信和协作,图3-1显示了它们之间的通信关系。用户线程向线程池中的主控线程发送消息,主控线程将消息负载均衡的分发给线程池中的若干计算线程。为了实现负载均衡分发,将所有的线程形成一个循环链表,设置一个指针,该指针总是指向刚被分发消息的下一个计算线程,则所有的线程获取消息的机会均等。计算线程计算完成后直接将消息计算结果返回给用户线程。设计实现的关键操作是线程池中主控线程分发线程,计算线程组成循环链表,完成消息计算,将消息结果返回给用户线程。 图 3-1 三种线程间通信 下面给出线程池,计算线程和主控线程的具体实现。 代码清单 3.1-a 线程池的实现 class CLMyCalculateThreadPro; CLThreadPool::CLThreadPool() //未指定线程数时默认构造的线程数为6 { ThreadNumber = 6; MainThread = mainThread; ThreadCount = NULL; //计算线程队列,初始为空 } CLThreadPool::CLThreadPool(int threadNumber) { if (threadNumber = 0) { threadNumber = 6; } ThreadNumber = threadNumber; MainThread = mainThread; //主控线程的名字 ThreadCount = NULL; } CLThreadPool::~CLThreadPool() { } void CLThreadPool::InitThreadPool()//初始化线程池 { //创建主控线程 CLThreadProxy proxyMain(new CLThreadMainProcessor(this), MainThread.c_str(), false); proxyMain.Run(0); for (int i = 1; i = ThreadNumber; i++)//创建若干计算线程 { CLThreadQueue *thread = new CLThreadQueue; char t[30]; std::string s; sprintf(t, %d, i); s = t; thread-ThreadName = thread_ + s; thread-Next = ThreadCount; ThreadCount = thread; CLThreadProxy proxy(new CLMyMsgProcessor, (thread-ThreadName).c_str(), false); proxy.Run(0); } CurrentThread = ThreadCount; } void CLThreadPool::UninitThreadPool() { } //用户向主控线程发送消息的实体 void CLThreadPool::PostMessageToMainThread(CLMessage *Msg) { CLExecutiveNameServer::PostExecutiveMessage(MainThread.c_str(), Msg); } 代码清单3.1-a是线程池的具体实现,在构造函数中,设置线程池中计算线程的数目,默认情况下为6;设置线程循环队列指针初始为空等。在线程池的初始化函数CLT

文档评论(0)

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

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

1亿VIP精品文档

相关文档