Linux高级环境编程实验报告4.doc
文本预览下载声明
作 业 报 告
学生姓名: 学 号: 指导教师:
学生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
显示全部