文档详情

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

发布:2017-04-17约6.91千字共8页下载文档
文本预览下载声明
作 业 报 告 学生姓名: 学 号: 指导教师: 学生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
显示全部
相似文档