




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)?zāi)康模?)、掌握基本的同步互斥算法,理解哲學(xué)家就餐模型。2)、了解windows2000/XP中多線程的并發(fā)執(zhí)行機(jī)制,線程間的同步和互斥。(3)、學(xué)習(xí)使用windows2000/XP中基本的同步對(duì)象,掌握相應(yīng)的 API。2、實(shí)驗(yàn)要求有五個(gè)哲學(xué)家共用一張放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五個(gè)碗和五只筷子,每人兩邊各放一只筷子。哲學(xué)家們是交替思考和進(jìn)餐,饑餓時(shí)便試圖取其左右最靠近他的筷子。條件:(1)、只有拿到兩只筷子時(shí),哲學(xué)家才能吃飯。(2)、如果筷子已被別人拿走,則必須等別人吃完之后才能拿到筷子。(3)、任意一個(gè)哲學(xué)家在自己未拿到兩只筷子吃飯前,不會(huì)放下手中拿到的筷子。3、實(shí)驗(yàn)環(huán)境硬件:CPU:AMDQL64內(nèi)存:2GB顯卡:ATI4570硬盤:日立250G軟件:Windows2000/XP。開發(fā)工具:VC++4、實(shí)驗(yàn)內(nèi)容1)實(shí)現(xiàn)原理1、利用記錄型信號(hào)量解決哲學(xué)家進(jìn)餐問題;2、臨界區(qū)互斥編程原理。)程序結(jié)構(gòu)(流程圖)開始定義信號(hào)量 tools[5]定義哲學(xué)家類對(duì)象 P1-P5哲學(xué)家的狀態(tài)發(fā)生改變;();();();();()輸出當(dāng)前狀態(tài)否停止程序結(jié)束圖1.主程序模塊流程圖開始哲學(xué)家處于的是 放下左右 否哲學(xué)家處于思考狀態(tài)否哲學(xué)家處于等待狀態(tài)為思考 是 狀 態(tài) 改 為 等 待是左右手筷子均空閑是拿起左右手筷子狀 態(tài) 改 為 就 餐結(jié)束圖2.狀態(tài)改變模塊流程圖圖3.返回哲學(xué)家狀態(tài)流程圖圖4返回餐具狀態(tài)模塊流程圖3)數(shù)據(jù)結(jié)構(gòu)(1)、定義一個(gè)哲學(xué)家類,包含兩個(gè)私有對(duì)象和四個(gè)公有對(duì)象。(2)、定義函數(shù):Number對(duì)象:哲學(xué)家的編號(hào);Status對(duì)象:保存當(dāng)前該哲學(xué)家的狀態(tài), 0表示等待,1表示吃飯,2表示思考;Philosopher(int num)方法:哲學(xué)家類構(gòu)造函數(shù),參數(shù) num表示哲學(xué)家編號(hào);find()const 方法:返回該哲學(xué)家編號(hào);getinfo()const 方法:返回哲學(xué)家當(dāng)前狀態(tài);Change()方法:根據(jù)題目要求改變哲學(xué)家的狀態(tài)(等待 ->進(jìn)餐->思考)另外,程序中包含一個(gè)公有對(duì)象,bool類型數(shù)組tools[6],用來保存6把餐具當(dāng)前狀態(tài):true表示該餐具當(dāng)前空閑,false表示該餐具當(dāng)前正被使用。程序中還包含兩個(gè)公有函數(shù):print 和toolstatus 。Print 用來返回一個(gè)哲學(xué)家的狀態(tài),toolstatus 用來返回一個(gè)餐具的狀態(tài)。4)實(shí)現(xiàn)步驟1)打開VC,選擇菜單項(xiàng)File->New,選擇Projects 選項(xiàng)卡并建立一個(gè)名為 xwj的win32consoleapplication工程,創(chuàng)建時(shí)注意指定創(chuàng)建該工程的目錄;(2)在工程中創(chuàng)建源文件:選擇菜單項(xiàng) Project->Addtoproject->Files, 此時(shí)將打開一個(gè)新窗口,在其中的“文件名”輸入欄中輸入自己想要?jiǎng)?chuàng)建的文件名,這里是;接著詢問是否創(chuàng)建新文件時(shí)回答“yes”。通過Workspace->SourceFiles打開該文件,在其中編輯源文件并保存;3)通過調(diào)用菜單項(xiàng)Build->Rebuildall進(jìn)行編譯連接,可以在指定的工程目錄下得到debug->程序。5、實(shí)驗(yàn)測(cè)試及分析:圖5.測(cè)試結(jié)果1圖6.測(cè)試結(jié)果2圖7.測(cè)試結(jié)果3圖8.測(cè)試結(jié)果45、結(jié)果分析:1)、程序分為四大模塊,一步步解決了哲學(xué)家狀態(tài)及狀態(tài)改變的問題,筷子的“閑”、“用”問題;2)、實(shí)現(xiàn)了哲學(xué)家等待、吃飯、思考三個(gè)過程的轉(zhuǎn)換循環(huán),并且避免了死鎖問題;3)、讓臨界資源得到了充分的利用。6、實(shí)驗(yàn)心得體會(huì)1)、這次實(shí)驗(yàn)加強(qiáng)了我上網(wǎng)查數(shù)檢索問題的能力;2)、這次實(shí)驗(yàn)讓我學(xué)會(huì)分模塊解決問題,怎樣運(yùn)用互斥鎖對(duì)臨界資源進(jìn)行管理;3)、這次實(shí)驗(yàn),發(fā)現(xiàn)自己在編程上及一些函數(shù)的認(rèn)識(shí)仍存在較大的問題,以后應(yīng)該多多實(shí)踐,提高自己的反應(yīng)速度,加強(qiáng)邏輯思維能力。附錄:源代碼#include<>#include<>#include<string>#include<iostream>#include<>usingnamespacestd;booltools[5];// 全局變量,用餐工具CRITICAL_SECTIONcs;//信號(hào)量, 在線程中使用,臨界區(qū)classPhilosopher{private:intnumber;intstatus; /* 標(biāo)記當(dāng)前哲學(xué)家的狀態(tài) ,0表示正在等待(即處于饑餓狀態(tài)),1表示得到兩支筷子正在吃飯,2表示正在思考*/public:Philosopher(intnum=0):status(2),number(num) {}constintfind(){returnnumber;}constintgetinfo(){returnstatus;}voidChange();// 狀態(tài)改變函數(shù)voiddead_lock();};/////////voidPhilosopher::dead_lock(){EnterCriticalSection(&cs);//strings;if(status==1){
進(jìn)入臨界區(qū)tools[number%5]=true;tools[(number-1)%5]=true;status=2;}elseif(status==2){status=0;//tools[(number-1)%5]=false;//tools[(number-1)%5]=true;}elseif(status==0){tools[number%5]=false;tools[(number-1)%5]=false;status=1;}LeaveCriticalSection(&cs);cout<<"*********";}/////////voidPhilosopher::Change(){EnterCriticalSection(&cs);// 進(jìn)入臨界區(qū)if(status==1)//{
正在進(jìn)餐tools[number%5]=true;//
放下左手工具tools[(number-1)%5]=true;//
放下右手工具status=2; //}
改變狀態(tài)為思考elseif(status==2)//{
思考中status=0; //}
改變狀態(tài)為等待elseif(status==0)//{
等待中if(tools[number%5]&&tools[(number-1)%5]) //
左右手兩邊工具均為空閑狀態(tài){tools[number%5]=false;//
拿起左手工具tools[(number-1)%5]=false;//status=1;}}LeaveCriticalSection(&cs);}stringprint(Philosopher*pA){//pA->Change();inti=pA->getinfo();stringstr;
拿起右手工具if(i==0)str=" 等待";elseif(i==1)str=" 就餐";elsestr=" 思考";returnstr;}stringtoolstatus(boola){stringstate;if(a==true)state=" 閑";if(a==false)state=" 用";returnstate;}intmain(){charcon='y';// 判斷是否繼續(xù)//con='n';for(inti=0;i<5;i++)tools[i]=true;// 筷子都未使用,初始化PhilosopherP1(1),P2(2),P3(3),P4(4),P5(5);InitializeCriticalSection(&cs);//
初始化初始化臨界區(qū)cout<<"-----------------------
狀 態(tài) 說
明 示 意
圖 :-----------------------"<<endl;cout<<"
"<<"
哲學(xué)家
1號(hào)的狀態(tài)"<<"
"<<endl;cout<<"筷子0的狀態(tài)"<<""<<"筷子1的狀態(tài)"<<endl;cout<<"哲學(xué)家5號(hào)的狀態(tài)"<<""<<"哲學(xué)家2號(hào)的狀態(tài)"<<endl;cout<<"筷子4的狀態(tài)"<<""<<"筷子2的狀態(tài)"<<endl;cout<<"哲學(xué)家4號(hào)的狀態(tài)"<<""<<"哲學(xué)家3號(hào)的狀態(tài)"<<endl;cout<<""<<"筷子3的狀態(tài)"<<endl;//cout<<""<<"哲學(xué)家3號(hào)的狀態(tài)"<<""<<endl;cout<<"筷子的狀態(tài),用表示使用中,閑表示空閑中。 "<<endl;cout<<"--------------------------------------------------------------"<<endl;//cout<<" 哲學(xué)家們開始生活:"<<endl;//cout<<" 當(dāng)前狀態(tài):";cout<<endl;//cin>>con;while(con=='y'){();();();();();cout<<"當(dāng)前狀態(tài)為:"<<endl;cout<<" "<<()<<print(&P1)<<" "<<endl;cout<<" "<<toolstatus(tools[0])<<""<<toolstatus(tools[1])<<endl;cout<<""<<()<<print(&P5)<<" "<<()<<print(&P2)<<endl;cout<<" "<<toolstatus(tools[4])<<""<<toolstatus(tools[2])<<endl;cout<<" "<<()<<print(&P4)<<" "<<()<<print(&P3)<<endl;cout<<" "<<toolstatus(tools[3])<<endl;cout<<"--------------------------"<<endl;cout<<"若要繼續(xù)下一狀態(tài),輸入 y;輸入n進(jìn)入死鎖;輸入其他,結(jié)束程序:";cin>>con;Sleep(20);}while(con=='n'){();();();();();cout<<"死鎖情況"<<endl;cout<<" "<<()<<print(&P1)<<" "<<endl;cout<<" "<<toolstatus(tools[0])<<""<<toolstatus(tools[1])<<endl;cout<<""<<()<<print(&P5)<<" "<<()<<print(&P2)<<endl;cout<<" "<<toolstatus(tools[4])<<""<<toolstatus(to
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山西財(cái)經(jīng)大學(xué)華商學(xué)院《金融數(shù)據(jù)采集》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼陽職業(yè)技術(shù)學(xué)院《電視欄目專題與制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州大學(xué)《產(chǎn)品設(shè)計(jì)報(bào)告書制作》2023-2024學(xué)年第二學(xué)期期末試卷
- 做賬實(shí)操-保險(xiǎn)公司理賠支出的賬務(wù)處理分錄
- 2025屆上海市寶山區(qū)高三一模考試歷史試卷
- 江西外語外貿(mào)職業(yè)學(xué)院《文獻(xiàn)查閱與交流》2023-2024學(xué)年第二學(xué)期期末試卷
- 柳州職業(yè)技術(shù)學(xué)院《行政倫理學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 長春職業(yè)技術(shù)學(xué)院《商務(wù)談判》2023-2024學(xué)年第二學(xué)期期末試卷
- 首都師范大學(xué)《工程制圖與全專業(yè)三維識(shí)圖課程設(shè)計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 魯迅美術(shù)學(xué)院《生物藥物制劑學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 改變學(xué)習(xí)方式促進(jìn)學(xué)生發(fā)展結(jié)題報(bào)告
- 軟件監(jiān)理報(bào)告
- 中國常見食物營養(yǎng)成分表
- 09J202-1 坡屋面建筑構(gòu)造(一)-2
- 光伏電站土建工程施工技術(shù)方案
- 2024年上海英語高考卷及答案完整版
- 物業(yè)公司客戶服務(wù)課件
- 腦卒中患者的康復(fù)護(hù)理查房
- 酶工程技術(shù)在茶葉深加工中的應(yīng)用
- 人教版英語八年級(jí)下冊(cè)全冊(cè)教案教學(xué)設(shè)計(jì)及教學(xué)反思
- 02J401 鋼梯【含03年修改】圖集
評(píng)論
0/150
提交評(píng)論