




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、實驗?zāi)康模?)、掌握基本的同步互斥算法,理解哲學家就餐模型。2)、了解windows2000/XP中多線程的并發(fā)執(zhí)行機制,線程間的同步和互斥。(3)、學習使用windows2000/XP中基本的同步對象,掌握相應(yīng)的 API。2、實驗要求有五個哲學家共用一張放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五個碗和五只筷子,每人兩邊各放一只筷子。哲學家們是交替思考和進餐,饑餓時便試圖取其左右最靠近他的筷子。條件:(1)、只有拿到兩只筷子時,哲學家才能吃飯。(2)、如果筷子已被別人拿走,則必須等別人吃完之后才能拿到筷子。(3)、任意一個哲學家在自己未拿到兩只筷子吃飯前,不會放下手中拿到的筷子。3、實驗環(huán)境硬件:CPU:AMDQL64內(nèi)存:2GB顯卡:ATI4570硬盤:日立250G軟件:Windows2000/XP。開發(fā)工具:VC++4、實驗內(nèi)容1)實現(xiàn)原理1、利用記錄型信號量解決哲學家進餐問題;2、臨界區(qū)互斥編程原理。)程序結(jié)構(gòu)(流程圖)開始定義信號量 tools[5]定義哲學家類對象 P1-P5哲學家的狀態(tài)發(fā)生改變;();();();();()輸出當前狀態(tài)否停止程序結(jié)束圖1.主程序模塊流程圖開始哲學家處于的是 放下左右 否哲學家處于思考狀態(tài)否哲學家處于等待狀態(tài)為思考 是 狀 態(tài) 改 為 等 待是左右手筷子均空閑是拿起左右手筷子狀 態(tài) 改 為 就 餐結(jié)束圖2.狀態(tài)改變模塊流程圖圖3.返回哲學家狀態(tài)流程圖圖4返回餐具狀態(tài)模塊流程圖3)數(shù)據(jù)結(jié)構(gòu)(1)、定義一個哲學家類,包含兩個私有對象和四個公有對象。(2)、定義函數(shù):Number對象:哲學家的編號;Status對象:保存當前該哲學家的狀態(tài), 0表示等待,1表示吃飯,2表示思考;Philosopher(int num)方法:哲學家類構(gòu)造函數(shù),參數(shù) num表示哲學家編號;find()const 方法:返回該哲學家編號;getinfo()const 方法:返回哲學家當前狀態(tài);Change()方法:根據(jù)題目要求改變哲學家的狀態(tài)(等待 ->進餐->思考)另外,程序中包含一個公有對象,bool類型數(shù)組tools[6],用來保存6把餐具當前狀態(tài):true表示該餐具當前空閑,false表示該餐具當前正被使用。程序中還包含兩個公有函數(shù):print 和toolstatus 。Print 用來返回一個哲學家的狀態(tài),toolstatus 用來返回一個餐具的狀態(tài)。4)實現(xiàn)步驟1)打開VC,選擇菜單項File->New,選擇Projects 選項卡并建立一個名為 xwj的win32consoleapplication工程,創(chuàng)建時注意指定創(chuàng)建該工程的目錄;(2)在工程中創(chuàng)建源文件:選擇菜單項 Project->Addtoproject->Files, 此時將打開一個新窗口,在其中的“文件名”輸入欄中輸入自己想要創(chuàng)建的文件名,這里是;接著詢問是否創(chuàng)建新文件時回答“yes”。通過Workspace->SourceFiles打開該文件,在其中編輯源文件并保存;3)通過調(diào)用菜單項Build->Rebuildall進行編譯連接,可以在指定的工程目錄下得到debug->程序。5、實驗測試及分析:圖5.測試結(jié)果1圖6.測試結(jié)果2圖7.測試結(jié)果3圖8.測試結(jié)果45、結(jié)果分析:1)、程序分為四大模塊,一步步解決了哲學家狀態(tài)及狀態(tài)改變的問題,筷子的“閑”、“用”問題;2)、實現(xiàn)了哲學家等待、吃飯、思考三個過程的轉(zhuǎn)換循環(huán),并且避免了死鎖問題;3)、讓臨界資源得到了充分的利用。6、實驗心得體會1)、這次實驗加強了我上網(wǎng)查數(shù)檢索問題的能力;2)、這次實驗讓我學會分模塊解決問題,怎樣運用互斥鎖對臨界資源進行管理;3)、這次實驗,發(fā)現(xiàn)自己在編程上及一些函數(shù)的認識仍存在較大的問題,以后應(yīng)該多多實踐,提高自己的反應(yīng)速度,加強邏輯思維能力。附錄:源代碼#include<>#include<>#include<string>#include<iostream>#include<>usingnamespacestd;booltools[5];// 全局變量,用餐工具CRITICAL_SECTIONcs;//信號量, 在線程中使用,臨界區(qū)classPhilosopher{private:intnumber;intstatus; /* 標記當前哲學家的狀態(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){
進入臨界區(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);// 進入臨界區(qū)if(status==1)//{
正在進餐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<<"
"<<"
哲學家
1號的狀態(tài)"<<"
"<<endl;cout<<"筷子0的狀態(tài)"<<""<<"筷子1的狀態(tài)"<<endl;cout<<"哲學家5號的狀態(tài)"<<""<<"哲學家2號的狀態(tài)"<<endl;cout<<"筷子4的狀態(tài)"<<""<<"筷子2的狀態(tài)"<<endl;cout<<"哲學家4號的狀態(tài)"<<""<<"哲學家3號的狀態(tài)"<<endl;cout<<""<<"筷子3的狀態(tài)"<<endl;//cout<<""<<"哲學家3號的狀態(tài)"<<""<<endl;cout<<"筷子的狀態(tài),用表示使用中,閑表示空閑中。 "<<endl;cout<<"--------------------------------------------------------------"<<endl;//cout<<" 哲學家們開始生活:"<<endl;//cout<<" 當前狀態(tài):";cout<<endl;//cin>>con;while(con=='y'){();();();();();cout<<"當前狀態(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進入死鎖;輸入其他,結(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等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化學必修二化學方程式總結(jié)模版
- 學前兒童發(fā)展 課件 第6章 學前兒童記憶的發(fā)展
- 公司財務(wù)審計報告總結(jié)模版
- 中學物理教學設(shè)計案例09級物理學班陸菲菲-
- 公司全員培訓總結(jié)
- 放血療法培訓
- 重癥肺炎患兒護理措施
- 熱處理車間安全管理
- 英語教師進城選調(diào)考試試題及答案
- 銀行中層面試題目及答案
- JJG 134-2023 磁電式速度傳感器檢定規(guī)程
- (高清版)TDT 1055-2019 第三次全國國土調(diào)查技術(shù)規(guī)程
- 五金銷售合同2023(含價格清單)
- 吉林省辦學基本標準手冊
- 4車道高速公路30米預(yù)應(yīng)力混凝土簡支T梁橋上部結(jié)構(gòu)設(shè)計_論文
- 體育——常用隊列隊形的口令及動作要領(lǐng)
- 2020年廣東省中考物理試卷分析
- 脫氨蒸氨工段操作規(guī)程
- 刑事案件結(jié)案登記表
- 城市設(shè)計導則案例
- 液壓絞車設(shè)計課件
評論
0/150
提交評論