




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、精選優(yōu)質文檔-傾情為你奉上課程設計說明書(操作系統(tǒng))題目: 睡眠理發(fā)師問題 院 系:計算機科學與工程專業(yè)班級:電子儀器12-2班 學 號: 學生姓名: 方 韜 指導教師: 王軍號 2014 年 12 月 23 日 專心-專注-專業(yè)安徽理工大學課程設計(論文)任務書 計算機科學與工程 學院 學 號學生姓名方韜專業(yè)(班級)電子儀器12-2設計題目睡眠理發(fā)師問題設計技術參數(shù)考慮一個理發(fā)店,只有一個理發(fā)師,只有n張可供顧客等待理發(fā)的椅子,如果沒有顧客,則理發(fā)師睡覺;如果有一顧客進入理發(fā)店發(fā)現(xiàn)理發(fā)師在睡覺,則把他叫醒,寫一個程序協(xié)調(diào)理發(fā)師和顧客之間的關系。通過研究Linux的線程機制和信號量實現(xiàn)睡眠理發(fā)
2、師問題(Sleeping-Barber Problem)的并發(fā)控制,用多線程同步方法解決睡眠理發(fā)師問題(Sleeping-Barber Problem)。 設計要求1、 每個顧客進入理發(fā)室后,即時顯示“Entered” 及其線程標識,還同時顯示理發(fā)室共有幾名顧客及其所坐的位置。2、至少有10個顧客,每人理發(fā)至少3秒鐘。3、在完成電子設計后,要求寫一份詳細的設計報告。工作量編寫代碼不少于200行;程設計說明書不少于15頁。工作計劃第一周:整體分析,查閱資料;第二周:總結出大概設計思路;第三周:著手實現(xiàn),寫好相應的代碼;第四周:系統(tǒng)調(diào)試,完善系統(tǒng)程序。參考資料計算機操作系統(tǒng)教材軟件工程C 使用手冊
3、指導教師簽字系主任簽字 2014年12月 23 日 學生姓名: 方韜 學號: 專業(yè)班級: 電子儀器12-2 課程設計題目: 睡眠理發(fā)師問題 指導教師評語:成績: 指導教師: 年 月 日安徽理工大學課程設計(論文)成績評定表目 錄 一.課程設計要求有一個理發(fā)師,一把理發(fā)椅和n把提供給等候理發(fā)的顧客座的椅子。如果沒有顧客,則理發(fā)師便在理發(fā)椅子上睡覺;當?shù)谝粋€顧客到來時,必須喚醒該理發(fā)師進行理發(fā);如果理發(fā)師正在理發(fā)時又有顧客到來,則如果有空椅子可坐,他就坐下來等待,如果沒有空椅子,他就離開理發(fā)店。為理發(fā)師和顧客各編一段程序描述他們的行為,要求不能帶有競爭條件,試用P、V操作實現(xiàn)。二.課程設計目的通過
4、本次課程設計,能深入徹底的弄清楚睡眠理發(fā)師問題,能夠舉一反三,遇到同樣的問題能夠很快解決。通過自己的實際操作,認真分析,理解進程,線程,信號量之間的關系和他們的實現(xiàn)過程,掌握一些基本的系統(tǒng)調(diào)用的用法及其所實現(xiàn)的功能。用C+來實現(xiàn)睡眠理發(fā)師的課程設計,達到復習C+相關知識的目的。三.設計思想說明此題可看作是n個生產(chǎn)者和1個消費者問題。顧客作為生產(chǎn)者,每到來一個就使計數(shù)器count增加1,以便讓理發(fā)師理發(fā)(相當于消費)至最后一個顧客(相當于產(chǎn)品)。并且,第1個到來的顧客應負責喚醒理發(fā)師;如果不是第1個到達的顧客,則在有空椅子的情況下坐下等待,否則離開理發(fā)店(該消息可由計數(shù)器count獲得)。主要有
5、以下一些函數(shù)來實現(xiàn)整個問題的實現(xiàn)過程:(1)用隨機函數(shù)random()來產(chǎn)生進入理發(fā)店的顧客。(2)定義理發(fā)師的理發(fā)函數(shù)cuthair()用來實現(xiàn)理發(fā)操作。(3)定義顧客被理發(fā)的函數(shù)gethaircut()用來實現(xiàn)顧客被理發(fā)的操作。(4)用顧客線程customer實現(xiàn)對顧客行為的控制。(5)用理發(fā)師線程barber實現(xiàn)對理發(fā)師行為的控制。(6)定義主函數(shù)main實現(xiàn)對兩個線程的控制和執(zhí)行操作。四.課程設計內(nèi)容4.1頭文件聲明#include "stdafx.h"#include "windows.h"#include "iostream.h&q
6、uot;#include "math.h"4.2定義各種變量int long waiting(0); int chairs; char open_door; char close_door; int count(0); int finish(0); 4.3信號量的定義DWORD a;% 互斥信號量:mutex 用來互斥對臨界變量count的訪問計數(shù)信號量 customers用來記錄等候的顧客數(shù)據(jù),barbers用來記錄等待的理發(fā)師數(shù),這里barbers只有兩種取值,要不是0要不是1臨界變量:count由理發(fā)師進程和顧客進程共同訪問,用來記錄在椅子上等著的顧客數(shù) &
7、#160; N 椅子數(shù),為最多等候的顧客數(shù)HANDLE Mutex =:CreateMutex(NULL, FALSE, "Mutex"); HANDLE barbers =:CreateSemaphore(NULL, 1,1, "barbers"); HANDLE customers =:CreateSemaphore(NULL,0,3,"customers");4.4相關函數(shù)及線程的定義定義隨機函數(shù)i
8、nt random()來產(chǎn)生顧客,并使兩個顧客間的時間少于15秒定義理發(fā)師的理發(fā)函數(shù)void cuthair(),用時15秒定義顧客被理發(fā)的函數(shù)void gethaircut()定義顧客線程DWORD WINAPI customer(LPVOID pParm2)定義理發(fā)師線程DWORD WINAPI barber(LPVOID pParm1)定義主函數(shù)實現(xiàn)線程的操作int main(int argc, char* argv)五.數(shù)據(jù)結構說明本程序用到了數(shù)據(jù)結構中的隊列,理發(fā)的顧客由隨機函數(shù)產(chǎn)生,顧客遵從先到先理發(fā)的原則,但隊列的長度限制為輸入的理發(fā)店中的椅子的個數(shù),當理發(fā)店的椅子沒有空位的時候
9、,到來的顧客主動退出加入隊列。理發(fā)師對隊列中的顧客進行先到先服務的原則理發(fā)。六.程序用到的系統(tǒng)調(diào)用(API)(1)CreateThread():創(chuàng)建線程(2)CreateMutex():找出當前系統(tǒng)是否已經(jīng)存在指定進程的實例。如果沒有則創(chuàng)建一個互斥體,用來同步。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。CreateMutex()函數(shù)可用來創(chuàng)建一個有名或無名的互斥量對象(3)CreateSemaphore():CreateSemaphore() 是系統(tǒng)提供的API,包含在Windows.h 中,應用在同步的處理中。作用是創(chuàng)建一個新的信號機,執(zhí)行成
10、功,返回信號機對象的句柄;零表示出錯。一旦不再需要,一定記住用CloseHandle關閉信號機的句柄。它的所有句柄都關閉以后,對象自己也會刪除。一旦值大于零,信號機就會觸發(fā)(發(fā)出信號)。Semaphore是一個同步問題機制,不論是Event或Mutex,其他Process在執(zhí)WaitForSingleObject時,就看當時的物件是Signal或UnSignal而決定是否等待,而Semaphore也相同,但是它要變成Signal /UnSignal的狀態(tài),卻有些不同,它是提供一個計數(shù)值,它允許在這個計數(shù)值之內(nèi),任何執(zhí)行到WaitForSingleObject的Thread都不會停下來,而且每執(zhí)
11、行WaitForSingleObject一次,計數(shù)值就減一,當計數(shù)值變成0時,該Semaphore才會處於UnSignal的狀態(tài),而某個Thread ReleaseSemaphore時,便會將計數(shù)值增加,以便其他的Thread或本身可得Signal的訊號,而使WaitForSingleObject停止等待。 (4)ReleaseSemaphore():ReleaseSemaphore()函數(shù)的作用是增加信號機的計數(shù)。如果成功,就調(diào)用信號機上的一個等待函數(shù)來減少它的計數(shù)。(5)WaitForSingleObject():函數(shù)用來檢測hHandle事件的信號狀態(tài),在某一線程中調(diào)用該函數(shù)時,線程暫時
12、掛起,如果在掛起的dwMilliseconds毫秒內(nèi),線程所等待的對象變?yōu)橛行盘枲顟B(tài),則該函數(shù)立即返回;如果超時時間已經(jīng)到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態(tài),函數(shù)照樣返回。參數(shù)dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函數(shù)立即返回;若為INFINITE,則線程一直被掛起,直到hHandle所指向的對象變?yōu)橛行盘枲顟B(tài)時為止。(6)ResumeThread():線程恢復函數(shù),使用該函數(shù)能激活線程的運行,使CPU分配資源讓線程恢復運行。(7)ReleaseMutex():釋放由線程擁有的一個互斥體(8)Sl
13、eep():睡眠等待七.程序總體算法流程圖程序開始鍵入店中的椅子數(shù)是否開始接待顧客 尚未營業(yè)Mutex理發(fā)師線程True顧客線程False有空椅等待是離開有顧客等待休息否理發(fā)師在睡覺則喚醒理發(fā),否則繼續(xù)是八.程序運行 (1)鍵入店中的椅子數(shù) (2)鍵入椅子數(shù)后詢問是否接待顧客 (3)開始接待顧客,第一個顧客到來 (4)依次有顧客到來 (5)還有顧客依次到來九.源代碼#include "stdafx.h"#include "windows.h"#include "iostream.h"#include "math.h"
14、;int long waiting(0); /等待理發(fā)的顧客人數(shù)int chairs; /店中椅子的總數(shù)目char open_door; /開門char close_door; /關門int count(0); /顧客的序號int finish(0); /已經(jīng)理完發(fā)的顧客人數(shù)DWORD a;(無符號整數(shù)32位)HANDLE Mutex =:CreateMutex(NULL, FALSE, "Mutex"); /用來實現(xiàn)進程的互斥 HANDLE barbers =:CreateSemaphore(NULL, 1,1, "barbers"); /定義信號量來
15、進行線程間的同步HANDLE customers =:CreateSemaphore(NULL,0,3,"customers"); /定義信號量來進行線程間的同步int random()/定義隨機函數(shù)來產(chǎn)生顧客,并使兩個顧客間的時間少于15秒 return (rand()*15000)/RAND_MAX;void cuthair()/理發(fā)師的理發(fā)函數(shù),用時15秒 :Sleep (15000);cout<<"理發(fā)結束 !"<<endl;void gethaircut()/ 顧客被理發(fā)的函數(shù):Sleep (15001); /顧客被理發(fā)
16、的函數(shù),為了和理發(fā)師之間有所區(qū)別,比理發(fā)師理發(fā)時間長1毫秒cout<<"第"<<finish<<"個顧客理發(fā)完畢,離開 "<<endl; DWORD WINAPI customer(LPVOID pParm2)/ 顧客線程:WaitForSingleObject(Mutex ,INFINITE); /P(mutex)來進行互斥操作count+; /來的是第幾個顧客cout<<"顧客敲門!第 "<<count<<" 個顧客到來 "&l
17、t;<endl; if (waiting<chairs) /如果有空椅子if (waiting!=0)cout<<"現(xiàn)在有"<<waiting <<" 個人在等待理發(fā)"<<endl;elsecout<<"無人在等待理發(fā)"<<endl; /輸出有多少人在等待waiting+;cout<<"剩余"<<chairs-waiting+1<<"個座位"<<endl;cout&
18、lt;<"有空位,顧客已坐下"<<endl;:ReleaseSemaphore(customers,1,NULL);/V(customer):ResumeThread(customers);/喚醒理發(fā)師進程:ReleaseMutex(Mutex);/釋放互斥量,以便其他線程使用:WaitForSingleObject(barbers,INFINITE);/等待理發(fā)gethaircut();/理發(fā)并離開elsecout<<"沒有空椅子,第"<<count<<"個顧客離開理發(fā)店"<
19、;<endl; /沒有椅子,顧客直接離開:ReleaseMutex(Mutex);return 0;DWORD WINAPI barber(LPVOID pParm1)/理發(fā)師線程 while(true) /外循環(huán) :WaitForSingleObject(customers,INFINITE);/p(customers),等待顧客:WaitForSingleObject(Mutex,INFINITE); /等待互斥量 waiting-; /等待的人數(shù)減1:ReleaseSemaphore(barbers,1,NULL); /釋放信號量:ResumeThread(barbers); /喚
20、醒顧客進程:ReleaseMutex(Mutex); /v(mutex); cuthair(); /理發(fā)finish+; /理發(fā)完畢的顧客數(shù)目加1 return 0;int main(int argc, char* argv)/實現(xiàn)線程的操作 cout<<"輸入理發(fā)店中的椅子個數(shù):"cin>>chairs;cout<<"店中有"<<chairs<<"把椅子"<<endl; /設置椅子數(shù)目cout<<"是否開始接待顧客?Y/N"<
21、;<endl; /是否開門營業(yè)cin>>open_door;while (open_door!='Y')cout<<endl<<"尚未營業(yè)!"<<endl;cout<<"是否開始接待顧客?Y/N"<<endl;cin>>open_door;HANDLE hThread1;HANDLE hThread2;hThread2=:CreateThread (NULL,0,barber,NULL,0,NULL); /產(chǎn)生一個理發(fā)師進程while (open_d
22、oor='y')while(close_door!='y') :Sleep(random();/函數(shù)實現(xiàn)顧客隨機到來hThread1=:CreateThread(NULL,0,customer,NULL,a,NULL);cout<<endl<<"正在營業(yè),請進!"<<endl; if (finish>=8 && waiting=0)/如果完成數(shù)超過8并且沒有人等待cout<<"已經(jīng)為"<<finish<<"個顧客理發(fā)了,是否停止營業(yè)?"<&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024市場營銷重點知識回顧試題及答案
- 復習建議的小自考漢語言考試試題及答案
- 2024年漢語言文學小自考綜合訓練試題及答案
- 2024視覺傳播設計課程復習試題及答案
- 小自考漢語言文學2024年復習提綱試題及答案匯整
- ps實操考試試題及答案
- 2025年板翅式換熱器項目合作計劃書
- 2025年節(jié)能型泵及環(huán)保用泵項目發(fā)展計劃
- 二零二五版設備售后維修的合同范例
- 社保雙方協(xié)議書二零二五年
- 網(wǎng)格絮凝池計算書
- 07J501-1鋼雨篷玻璃面板圖集
- 【教案】第五課+雅與俗的交流-經(jīng)濟、科技發(fā)展與美術作品的關系+教學設計高中美術湘美版(2019)美術鑒賞
- 醫(yī)院網(wǎng)絡布線改造施工方案
- 普通診所污水、污物、糞便處理方案及周邊環(huán)境情況說明
- 《勸學》學業(yè)水平考試復習(學生版)
- 兒童保健科疾病診療常規(guī)診療規(guī)范
- 商標注冊委托協(xié)議書
- 2023年中考語文備考之名著閱讀《鋼鐵是怎樣煉成的》2022年中考真題集合
- 鋁合金門窗質量管理體系及保證措施
- 員工宿舍物業(yè)管理服務方案
評論
0/150
提交評論