資源描述:
《Linux高級環(huán)境編程實(shí)驗(yàn)報(bào)告3》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、作業(yè)報(bào)告學(xué)生姓名:學(xué)號:指導(dǎo)教師:學(xué)生E-mail:一、作業(yè)名稱:自定義消息隊(duì)列二、作業(yè)要求自行設(shè)計(jì)一個消息隊(duì)列(不能依賴已有庫的隊(duì)列),實(shí)現(xiàn)一般隊(duì)列的操作:入列、出列以及隊(duì)列判空,另外要保證線程安全,并且能夠接收CLMessage類繼承體系的消息;需要提供發(fā)送消息的通信類,以及循環(huán)消息的管理類,保證能夠支持線程之間的通信。三、設(shè)計(jì)與實(shí)現(xiàn)根據(jù)要求分析,首先不能依賴已有庫的隊(duì)列,我們可以利用單鏈表來創(chuàng)建一個隊(duì)列,對于消息的出隊(duì)與入隊(duì)操作,需要設(shè)定兩個指針,頭指針和尾指針,分別指向隊(duì)頭和隊(duì)尾,根據(jù)隊(duì)
2、列的要求,隊(duì)頭處只能讀(出隊(duì)),隊(duì)尾只能寫(入隊(duì))。對于判空操作,設(shè)定隊(duì)頭指針等于隊(duì)尾指針時(shí)為空。代碼清單3.1自定義隊(duì)列的實(shí)現(xiàn)structCLNode//鏈表節(jié)點(diǎn){Tdata;structCLNode*next;};templateclassCLMyQueue{private:structCLNode*QueueHead;//隊(duì)頭指針structCLNode*QueueTail;//隊(duì)尾指針public:CLMyQueue();~CLMyQueue();voidPu
3、sh(Tdata);//數(shù)據(jù)入隊(duì)操作TPop();//數(shù)據(jù)出隊(duì)操作boolIsEmpty();//不能從空隊(duì)列讀數(shù)據(jù),因此需進(jìn)行隊(duì)列判空};templateCLMyQueue::CLMyQueue()//構(gòu)造函數(shù)中對隊(duì)列進(jìn)行初始化操作,隊(duì)頭、隊(duì)尾置空{(diào)QueueHead=NULL;QueueTail=NULL;}templateCLMyQueue::~CLMyQueue()//析構(gòu)函數(shù)清空隊(duì)列中的所有數(shù)據(jù){while(QueueHead!=NULL)/
4、/隊(duì)頭不為空,則清除隊(duì)頭,繼續(xù)找隊(duì)頭的后繼結(jié)點(diǎn),刪除所有的結(jié)點(diǎn)數(shù)據(jù){structCLNode*t=QueueHead;QueueHead=QueueHead->next;deletet;}}templatevoidCLMyQueue::Push(Tdata)//數(shù)據(jù)入隊(duì)操作{if(IsEmpty())//如果隊(duì)列為空,將數(shù)據(jù)入隊(duì),并且隊(duì)頭和隊(duì)尾指針都指向該數(shù)據(jù){QueueHead=newstructCLNode;QueueHead->data=data;Queu
5、eTail=QueueHead;return;}//在隊(duì)尾插入數(shù)據(jù)structCLNode*newNode=newstructCLNode;newNode->data=data;newNode->next=NULL;QueueTail->next=newNode;QueueTail=newNode;}templateTCLMyQueue::Pop()//數(shù)據(jù)出隊(duì)操作{if(IsEmpty())//不能從空隊(duì)列中讀數(shù)據(jù),因此判定隊(duì)列是否為空,空則返回空指針{ret
6、urnNULL;}Tdata=QueueHead->data;//取出對頭數(shù)據(jù),并修改隊(duì)頭指針structCLNode*t=QueueHead;QueueHead=QueueHead->next;deletet;returndata;}templateboolCLMyQueue::IsEmpty()//判斷隊(duì)列是否為空{(diào)if(QueueHead==NULL)//當(dāng)隊(duì)頭指針為空時(shí),隊(duì)列為空{(diào)returntrue;}returnfalse;}代碼清單3.1給出了自定義消息
7、隊(duì)列的實(shí)現(xiàn)。開始定義了單鏈表結(jié)點(diǎn)的結(jié)構(gòu)。在自定義隊(duì)列類CLMyQueue中給出了入隊(duì)和出隊(duì)的操作,分別是Push和Pop函數(shù),當(dāng)然,要注意一些細(xì)節(jié),在出隊(duì)時(shí)要判斷隊(duì)列是否為空,若為空則無法進(jìn)行出隊(duì)操作,同樣在進(jìn)行入隊(duì)操作是要判斷是否隊(duì)滿。四、測試自定義兩個CLMessage類的繼承體,封裝乘法操作的CLMultipMessage消息類和CLQuitMessage退出消息類,定義子線程的回調(diào)函數(shù),即子線程的執(zhí)行體。在main()函數(shù)中,創(chuàng)建子線程,主線程向消息隊(duì)列傳遞CLSUBMessage消息和
8、CLQuitMessage消息。子線程從隊(duì)列中獲取消息,并執(zhí)行相應(yīng)消息體操作如減法操作和退出操作。代碼清單4.1測試代碼classCLMsgPro;classCLMultipMessage:publicCLMessage//繼承CLMessage的乘法消息{public:friendclassCLMsgPro;CLMultipMessage(intOp1,intOp2):CLMessage(MULTIP_MSG)//構(gòu)造函數(shù)初始化{m_Op1=Op1;m_Op2=Op2;}virtual~CLM