資源描述:
《Linux高級(jí)環(huán)境編程實(shí)驗(yàn)報(bào)告4》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、作業(yè)報(bào)告學(xué)生姓名:學(xué)號(hào):指導(dǎo)教師:學(xué)生E-mail:一、作業(yè)名稱:多隊(duì)列線程池的應(yīng)用二、作業(yè)要求設(shè)計(jì)并實(shí)現(xiàn)一個(gè)整數(shù)加法運(yùn)算的線程池,其中能夠接收三種線程:1、用戶線程,向線程池(主控線程)提交加法運(yùn)算請(qǐng)求;2、主控線程,接收用戶線程提出的加法運(yùn)算請(qǐng)求,并負(fù)載均衡地將請(qǐng)求下發(fā)到若干計(jì)算線程;3、若干計(jì)算進(jìn)程,接收來自于主控線程轉(zhuǎn)發(fā)的加法計(jì)算請(qǐng)求,完成加法計(jì)算,并將計(jì)算結(jié)果直接返回給用戶線程。另外,這三種線程都應(yīng)具有各自的消息隊(duì)列,來完成加法計(jì)算請(qǐng)求的發(fā)送與轉(zhuǎn)發(fā),并返回計(jì)算結(jié)果。具體業(yè)務(wù)要求:1)、用戶線程需同時(shí)向主控線程提出>=
2、1000個(gè)加法計(jì)算請(qǐng)求2)、用戶線程需要驗(yàn)證是否收到了這些加法計(jì)算的結(jié)果三、設(shè)計(jì)與實(shí)現(xiàn)根據(jù)作業(yè)要求分析,需要設(shè)個(gè)三中線程,而且三種線程之間還要相互通信和協(xié)作,圖3-1顯示了它們之間的通信關(guān)系。用戶線程向線程池中的主控線程發(fā)送消息,主控線程將消息負(fù)載均衡的分發(fā)給線程池中的若干計(jì)算線程。為了實(shí)現(xiàn)負(fù)載均衡分發(fā),將所有的線程形成一個(gè)循環(huán)鏈表,設(shè)置一個(gè)指針,該指針總是指向剛被分發(fā)消息的下一個(gè)計(jì)算線程,則所有的線程獲取消息的機(jī)會(huì)均等。計(jì)算線程計(jì)算完成后直接將消息計(jì)算結(jié)果返回給用戶線程。設(shè)計(jì)實(shí)現(xiàn)的關(guān)鍵操作是線程池中主控線程分發(fā)線程,計(jì)算線程
3、組成循環(huán)鏈表,完成消息計(jì)算,將消息結(jié)果返回給用戶線程。圖3-1三種線程間通信下面給出線程池,計(jì)算線程和主控線程的具體實(shí)現(xiàn)。代碼清單3.1-a線程池的實(shí)現(xiàn)classCLMyCalculateThreadPro;CLThreadPool::CLThreadPool()//未指定線程數(shù)時(shí)默認(rèn)構(gòu)造的線程數(shù)為6{ThreadNumber=6;MainThread="mainThread";ThreadCount=NULL;//計(jì)算線程隊(duì)列,初始為空}CLThreadPool::CLThreadPool(intthreadNumber){
4、if(threadNumber<=0){threadNumber=6;}ThreadNumber=threadNumber;MainThread="mainThread";//主控線程的名字ThreadCount=NULL;}CLThreadPool::~CLThreadPool(){}voidCLThreadPool::InitThreadPool()//初始化線程池{//創(chuàng)建主控線程CLThreadProxyproxyMain(newCLThreadMainProcessor(this),MainThread.c_str(
5、),false);proxyMain.Run(0);for(inti=1;i<=ThreadNumber;i++)//創(chuàng)建若干計(jì)算線程{CLThreadQueue*thread=newCLThreadQueue;chart[30];std::strings;sprintf(t,"%d",i);s=t;thread->ThreadName="thread_"+s;thread->Next=ThreadCount;ThreadCount=thread;CLThreadProxyproxy(newCLMyMsgProcessor,(
6、thread->ThreadName).c_str(),false);proxy.Run(0);}CurrentThread=ThreadCount;}voidCLThreadPool::UninitThreadPool(){}//用戶向主控線程發(fā)送消息的實(shí)體voidCLThreadPool::PostMessageToMainThread(CLMessage*Msg){CLExecutiveNameServer::PostExecutiveMessage(MainThread.c_str(),Msg);}代碼清單3.1-a是
7、線程池的具體實(shí)現(xiàn),在構(gòu)造函數(shù)中,設(shè)置線程池中計(jì)算線程的數(shù)目,默認(rèn)情況下為6;設(shè)置線程循環(huán)隊(duì)列指針初始為空等。在線程池的初始化函數(shù)CLThreadPool::InitThreadPool中創(chuàng)建主控線程和若干計(jì)算線程。用戶調(diào)用PostMessageToMainThread函數(shù)向主控線程發(fā)送消息實(shí)體,參數(shù)是指向CLMessge類的對(duì)象。代碼清單3.1-b計(jì)算線程的實(shí)現(xiàn)CLMyCalculateThreadPro::CLMyCalculateThreadPro(){}CLMyCalculateThreadPro::~CLMyCalcu
8、lateThreadPro(){}//將加法消息和退出消息的執(zhí)行注冊(cè)到消息的回調(diào)函數(shù)中CLStatusCLMyCalculateThreadPro::Initialize(CLMessageLoopManager*pMessageLoop,void*pContext){pMe