- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- L1基础自动化系统的铁区MES的实现.docx VIP
- 2025年山东普通高中学业水平等级考试生物真题及答案 - 副本 .pdf VIP
- PEMS相关模板(PEMS软件开发计划或开发生命周期&可编程医用电气系统(PEMS)检查文件清单).pdf VIP
- 旅游接待业 课件全套 第1--10章 旅游接待业导论---旅游接待业高质量发展.pptx
- 运维服务项目实施组织及管理措施.docx VIP
- 柔性器件材料与结构失效分析.pptx VIP
- IPC-9850中文版.doc
- 2025年四川自贡市中考英语试卷含答案.docx VIP
- 2019年国庆70周年阅兵装备解读报告.pptx
- 2024人教版PEP英语三年级上册全册教学设计教案含反思.pdf
文档评论(0)