睡眠理髮師課程設計報告

2021-08-05 20:11:21 字數 4080 閱讀 5887

《作業系統》課程設計報告

專業: 電腦科學與技術

班級: 08 計本(2)班

題目名稱: 理髮師問題

完成日期: 2011 . 6

甘肅政法學院電腦科學學院

目錄一.題目內容 2

二.課程設計目的 3

三.設計思想說明 3

四.系統結構的說明 3

(一)標頭檔案宣告 3

(二)定義各種變數 3

(三)訊號量的定義 3

(四)相關函式及執行緒的定義 3

五.資料結構說明 4

六.程式用到的系統呼叫(api) 4

七.程式總體演算法流程圖 4

八.程式執行 5

九.使用說明書 7

十.程式設計總結 7

參考文獻 8

附錄 8

(一)**清單 8

(二)課程設計分工表 11

睡眠理髮師問題

有乙個理髮師,一把理髮椅和n把提供給等候理髮的顧客座的椅子。如果沒有顧客,則理髮師便在理髮椅子上睡覺;當第乙個顧客到來時,必須喚醒該理髮師進行理髮;如果理髮師正在理髮時又有顧客到來,則如果有空椅子可坐,他就坐下來等待,如果沒有空椅子,他就離開理髮店。

為理髮師和顧客各編一段程式描述他們的行為,要求不能帶有競爭條件,試用p、v操作實現。

通過本次課程設計,能深入徹底的弄清楚睡眠理髮師問題,能夠舉一反三,遇到同樣的問題能夠很快解決。通過自己的實際操作,認真分析,理解程序,執行緒,訊號量之間的關係和他們的實現過程,掌握一些基本的系統呼叫的用法及其所實現的功能。用c++來實現睡眠理髮師的課程設計,達到複習c++相關知識的目的。

此題可看作是n個生產者和1個消費者問題。

顧客作為生產者,每到來乙個就使計數器count增加1,以便讓理髮師理髮(相當於消費)至最後乙個顧客(相當於產品)。並且,第1個到來的顧客應負責喚醒理髮師;如果不是第1個到達的顧客,則在有空椅子的情況下坐下等待,否則離開理髮店(該訊息可由計數器count獲得)。主要有以下一些函式來實現整個問題的實現過程:

(1)用隨機函式random()來產生進入理髮店的顧客。

(2)定義理髮師的理髮函式cuthair()用來實現理髮操作。

(3)定義顧客被理髮的函式gethaircut()用來實現顧客被理髮的操作。

(4)用顧客執行緒customer實現對顧客行為的控制。

(5)用理髮師執行緒barber實現對理髮師行為的控制。

(6)定義主函式main實現對兩個執行緒的控制和執行操作。

(一)標頭檔案宣告

#include "stdafx.h"

#include "windows.h"

#include "iostream.h"

#include "math.h"

(二)定義各種變數

int long waiting(0

int chairs

char open_door

char close_door

int count(0

int finish(0

(三)訊號量的定義

dword a;% 互斥訊號量:mutex 用來互斥對臨界變數count的訪問

計數訊號量 customers用來記錄等候的顧客資料,barbers用來記錄等待的理髮師數,這裡barbers只有兩種取值,要不是0要不是1

臨界變數:count由理髮師程序和顧客程序共同訪問,用來記錄在椅子上等著的顧客數

n 椅子數,為最多等候的顧客數

handle mutex =::createmutex(null, false, "mutex");

handle barbers =::createsemaphore(null, 1,1, "barbers");

handle customers =::createsemaphore(null,0,3,"customers");

(四)相關函式及執行緒的定義

定義隨機函式int random()來產生顧客,並使兩個顧客間的時間少於15秒

定義理髮師的理髮函式void cuthair(),用時15秒

定義顧客被理髮的函式void gethaircut()

定義顧客執行緒dword winapi customer(lpvoid pparm2)

定義理髮師執行緒dword winapi barber(lpvoid pparm1)

定義主函式實現執行緒的操作int main(int argc, char* argv)

本程式用到了資料結構中的佇列,理髮的顧客由隨機函式產生,顧客遵從先到先理髮的原則,但佇列的長度限制為輸入的理髮店中的椅子的個數,當理髮店的椅子沒有空位的時候,到來的顧客主動退出加入佇列。理髮師對佇列中的顧客進行先到先服務的原則理髮。

六.程式用到的系統呼叫(api)

(1)createthread():建立執行緒

(2)createmutex():找出當前系統是否已經存在指定程序的例項。如果沒有則建立乙個互斥體,用來同步。

如果乙個執行緒獲取了互斥體,則要獲取該互斥體的第二個執行緒將被掛起,直到第乙個執行緒釋放該互斥體。createmutex()函式可用來建立乙個有名或無名的互斥量物件

(3)createsemaphore():createsemaphore() 是系統提供的api,包含在windows.h 中,應用在同步的處理中。

作用是建立乙個新的訊號機,執行成功,返回訊號機物件的控制代碼;零表示出錯。一旦不再需要,一定記住用closehandle關閉訊號機的控制代碼。它的所有控制代碼都關閉以後,物件自己也會刪除。

一旦值大於零,訊號機就會觸發(發出訊號)。semaphore是乙個同步問題機制,不論是event或mutex,其他process在執waitforsingleobject時,就看當時的物件是signal或unsignal而決定是否等待,而semaphore也相同,但是它要變成signal /unsignal的狀態,卻有些不同,它是提供乙個計數值,它允許在這個計數值之內,任何執行到waitforsingleobject的thread都不會停下來,而且每執行waitforsingleobject一次,計數值就減一,當計數值變成0時,該semaphore才會處於unsignal的狀態,而某個thread releasesemaphore時,便會將計數值增加,以便其他的thread或本身可得signal的訊號,而使waitforsingleobject停止等待。

(4)releasesemaphore():releasesemaphore()函式的作用是增加訊號機的計數。如果成功,就呼叫訊號機上的乙個等待函式來減少它的計數。

(5)waitforsingleobject():函式用來檢測hhandle事件的訊號狀態,在某一線程中呼叫該函式時,執行緒暫時掛起,如果在掛起的dwmilliseconds毫秒內,執行緒所等待的物件變為有訊號狀態,則該函式立即返回;如果超時時間已經到達dwmilliseconds毫秒,但hhandle所指向的物件還沒有變成有訊號狀態,函式照樣返回。引數dwmilliseconds有兩個具有特殊意義的值:

0和infinite。若為0,則該函式立即返回;若為infinite,則執行緒一直被掛起,直到hhandle所指向的物件變為有訊號狀態時為止。

(6)resumethread():執行緒恢復函式,使用該函式能啟用執行緒的執行,使cpu分配資源讓執行緒恢復執行。

(7)releasemutex():釋放由執行緒擁有的乙個互斥體

(8)sleep():睡眠等待

七.程式總體演算法流程圖

八.程式執行

1)鍵入店中的椅子數

2)鍵入椅子數後詢問是否接待顧客

3)開始接待顧客,第乙個顧客到來

4)依次有顧客到來

5)還有顧客依次到來

開啟vc++6.00編譯環境,新建工程名,將上述**複製貼上編譯執行即可看到執行視窗。然後根據視窗提示,從鍵盤輸入椅子數並按回車鍵即可。

然後再根據提示,即可進行相應操作。其中一些視窗內容如上面一些截圖所示。

通過這次課程設計,我們搜尋了理髮師問題的相關資料,又對課本知識進行了進一步的深入學習。在完成該程式的編寫的過程中,使我對課堂上所學的理論知識有了乙個更深更具體的認識,尤其對作業系統課程中的訊號量,執行緒,中斷等內容有了進一步的認識,並吸收整合了網路上一些優秀的**,經歷了不少艱辛,終於完成了此項任務。

球閥課程設計報告 ProE課程設計

一.課題名稱 球閥班級 12機自a1 小組成員 李軍帥 組長 李軍帥 二.球閥的功能和工作原理描述 1.球閥的工作原理 球閥的主要驅動原件是裝配於閥杆上端的扳手,球閥的啟閉元件是位於閥桿下端的球體。球閥的主要工作原理是 當給扳手施加某一轉矩,扳手驅動閥桿旋轉,閥桿將扳手的轉矩傳遞給位於閥桿下端的球體...

課程設計報告

數位電路課程設計報告 題目姓名 班級學號 同組人報告得分 南京航空航天大學金城學院 目錄一 課設內容及要求 1 設計任務 2 設計指標 二 設計方案 1 總體設計方案說明 2 模組結構與方框圖 三 電路設計與器件選擇 1 功能模組一 實際名 1 模組電路及引數計算 2 工作原理和功能說明 3 器件說...

課程設計報告

題目院 系電子與資訊工程學院 專業電子資訊科學與技術 班級姓名 設計日期 報告書寫要求 1 報告的撰寫要求條理清晰 語言準確 表述簡明。報告中段首空兩個字元,中文字型為宋體五號,數字 字元 字母為times new roman五號,且單倍行距。2 報告中插圖應與文字緊密配合,文圖相符,技術內容正確。...