版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 《操作系統(tǒng)》課程設(shè)計說明書</p><p> 設(shè)計題目 進程通信與進程同步機制實現(xiàn) </p><p> 學(xué)生姓名 </p><p> 指導(dǎo)老師 </p><p> 學(xué) 院
2、 </p><p> 專業(yè)班級 軟件工程1002班 </p><p> 學(xué)號 </p><p> 完成時間 2013年1月9日 </p><
3、p><b> 課程設(shè)計題目</b></p><p> 某銀行提供10個服務(wù)窗口(7個對私服務(wù)窗口,3個對公服務(wù)窗口)和100個供顧客等待的座位。顧客到達銀行時,若有空座位,則到取號機上領(lǐng)取一個號,等待叫號。取號機每次僅允許一位顧客使用,有對公和對私兩類號,美味顧客只能選取其中一個。當(dāng)營業(yè)員空閑時,通過叫號選取一位顧客,并為其服務(wù)。請用P、V操作寫出進程的同步算法。</p>
4、;<p><b> 課程設(shè)計目的</b></p><p> 1、掌握基本的同步與互斥算法,理解銀行排隊系統(tǒng)操作模型。</p><p> 2、學(xué)習(xí)使用Windows 2000/XP中基本的同步對象,掌握相關(guān)API的使用方法。</p><p> 3、了解Windows 2000/XP中多線程的并發(fā)執(zhí)行機制,實現(xiàn)進程的同步與互斥
5、。</p><p><b> 三.課程設(shè)計要求</b></p><p> ◆學(xué)習(xí)并理解生產(chǎn)者/消費者模型及其同步/互斥規(guī)則;</p><p> ◆學(xué)習(xí)了解Windows同步對象及其特性;</p><p> ◆熟悉實驗環(huán)境,掌握相關(guān)API的使用方法;</p><p> ◆設(shè)計程序,實現(xiàn)生產(chǎn)
6、者/消費者進程(線程)的同步與互斥;</p><p><b> ◆提交實驗報告。</b></p><p><b> 四.需要了解的知識</b></p><p><b> 1.同步對象</b></p><p> 同步對象是指Windows中用于實現(xiàn)同步與互斥的實體,包括信
7、號量(Semaphore)、互斥量(Mutex)、臨界區(qū)(Critical Section)和事件(Events)等。本實驗中使用到信號量、互斥量和臨界區(qū)三個同步對象。</p><p> 2.同步對象的使用步驟:</p><p> ◆創(chuàng)建/初始化同步對象。</p><p> ◆請求同步對象,進入臨界區(qū)(互斥量上鎖)。</p><p>
8、 ◆釋放同步對象(互斥量解鎖)。</p><p> 五.需要用到的API函數(shù)及相關(guān)函數(shù)</p><p> 我們利用Windows SDK提供的API編程實現(xiàn)實驗題目要求,而VC中包含有Windows SDK的所有工具和定義。要使用這些API,需要包含堆這些函數(shù)進行說明的SDK頭文件——最常見的是Windows.h(特殊的API調(diào)用還需要包含其他頭文件)。</p><
9、p> 本實驗使用到的API的功能和使用方法簡單介紹</p><p> 1、WaitForSingleObject( hSemaphoreChairs , INFINITE );</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> 功能——使程序處于等待狀態(tài),直到信號量hHandle出現(xiàn)
10、(即其值大于等于1)或超過規(guī)定的等待時間</p><p><b> 格式</b></p><p> DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);</p><p><b> 參數(shù)說明</b></p><p>
11、hHandle——信號量指針。</p><p> dwMilliseconds——等待的最長時間(INFINITE為無限等待)。</p><p> 2、ReleaseMutex( hMutex );</p><p> 功能——打開互斥鎖,即把互斥量加1。成功調(diào)用則返回0</p><p><b> 格式</b>&l
12、t;/p><p> BOOL ReleaseMutex(HANDLE hMutex);</p><p> ReleaseSemaphore( hSemaphoreShoppers ,1,NULL);</p><p> 功能——對指定信號量加上一個指定大小的量。成功執(zhí)行則返回非0值</p><p><b> 格式</b>
13、;</p><p> BOOL ReleaseSemaphore(HANDLE hSemaphore,</p><p> LONG lReleaseCount,</p><p> LPLONG lppreviousCount );</p><p><b> 參數(shù)說明</b></p><p>
14、; hSemaphore——信號量指針。</p><p> lReleaseCount——信號量的增量。</p><p> lppreviousCount——保存信號量當(dāng)前值。</p><p> 3、hShoppersThread = CreateThread ( NULL ,0 , fnTreadFunction ,NULL , 0 ,NULL );&l
15、t;/p><p> CreateThread</p><p> 功能——創(chuàng)建一個在調(diào)用進程的地址空間中執(zhí)行的線程</p><p><b> 格式</b></p><p> HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,</p>
16、<p> DWORD dwStackSize,</p><p> LPTHREAD_START_ROUTINE lpStartAddress,</p><p> LPVOID lpParamiter,</p><p> DWORD dwCreationFlags,</p><p> Lpdword lpThread )
17、;</p><p><b> 參數(shù)說明</b></p><p> lpThreadAttributes——指向一個LPSECURITY_ATTRIBUTES(新線程的安全性描述符)。</p><p> dwStackSize——定義原始堆棧大小。</p><p> lpStartAddress——指向使用LPTH
18、RAED_START_ROUTINE類型定義的函數(shù)。</p><p> lpParamiter——定義一個給進程傳遞參數(shù)的指針。</p><p> dwCreationFlags——定義控制線程創(chuàng)建的附加標(biāo)志。</p><p> lpThread——保存線程標(biāo)志符(32位)</p><p> 4、hMutex = CreateMute
19、x ( NULL , FALSE , NULL );</p><p> hMutexBarber = CreateMutex ( NULL , FALSE , NULL );</p><p> 功能——創(chuàng)建一個命名或匿名的互斥量對象</p><p><b> 格式</b></p><p> HANDLE Crea
20、teMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,</p><p> BOOL bInitialOwner,</p><p> LPCTSTR lpName);</p><p> 5. hSemaphoreChairs = CreateSemaphore ( NULL ,dwWaitVolume , dwWait
21、Volume , NULL );</p><p> hSemaphoreShoppers = CreateSemaphore ( NULL ,0 , dwWaitVolume , NULL );</p><p> 功能——創(chuàng)建一個命名或匿名的信號量對象</p><p><b> 格式</b></p><p> H
22、ANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,</p><p> LONG lInitialCount,</p><p> LONG lMaximumCount,</p><p> LPCTSTR lpName );</p><p><b>
23、 參數(shù)說明</b></p><p> lpSemaphoreAttributes——必須取值NULL。</p><p> lInitialCount——信號量的初始值。該值大于0,但小于lMaximumCount指定的最大值。</p><p> lMaximumCount——信號量的最大值。</p><p> lpNam
24、e——信號量名稱。</p><p> hBarberThread = CreateThread ( NULL ,0 , fnBarberFunction ,NULL , 0 ,NULL );</p><p> 功能——創(chuàng)建一個在調(diào)用進程的地址空間中執(zhí)行的線程</p><p><b> 格式</b></p><p>
25、; HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,</p><p> DWORD dwStackSize,</p><p> LPTHREAD_START_ROUTINE lpStartAddress,</p><p> LPVOID lpParamiter,</p>
26、<p> DWORD dwCreationFlags,</p><p> Lpdword lpThread );</p><p><b> 參數(shù)說明</b></p><p> lpThreadAttributes——指向一個LPSECURITY_ATTRIBUTES(新線程的安全性描述符)。</p><
27、p> dwStackSize——定義原始堆棧大小。</p><p> lpStartAddress——指向使用LPTHRAED_START_ROUTINE類型定義的函數(shù)。</p><p> lpParamiter——定義一個給進程傳遞參數(shù)的指針。</p><p> dwCreationFlags——定義控制線程創(chuàng)建的附加標(biāo)志。</p>&
28、lt;p> lpThread——保存線程標(biāo)志符(32位)</p><p><b> 六.原理及算法</b></p><p><b> 1、信號量設(shè)置</b></p><p> hMutex:取號機互斥信號量</p><p> hSemaphorePubCus:等待對公服務(wù)顧客的數(shù)量&
29、lt;/p><p> hSemaphorePriCus:等待對私服務(wù)顧客的數(shù)量</p><p> hSemaphoreSeats:剩余空座位的數(shù)量</p><p><b> 2、線程創(chuàng)建</b></p><p> fnPubser1,fnPubser2,fnPubser3:3個對公窗口線程</p>&l
30、t;p> fnPriser1,fnPriser2,fnPriser3,fnPriser4,fnPriser5,fnPriser6,</p><p> fnPriser7:7個對私窗口線程</p><p> fnPubTreadFunction:對公顧客線程</p><p> fnPriTreadFunction:對私顧客線程</p>&l
31、t;p> seat :可用座位數(shù)量 </p><p> Pubcus=0:初始對公顧客等待數(shù)量</p><p> Pricus=0:初始對私顧客等待數(shù)量</p><p> dwCustoms=0:初始顧客排隊數(shù)量</p><p><b> 3、P、V操作</b></p><p>
32、 semaphore hMutex,hSemaphorePubCus,hSemaphorePriCus,hSemaphoreSeats;</p><p> int seat,Pubcus=0,Pricus=0,dwCustoms=0;</p><p> hMutex.value=1;hSemaphorePubCus.value=0;hSemaphorePriCus.value=0;
33、hSemaphoreSeats.value=seat;</p><p> process A//顧客線程</p><p> { int i=0;</p><p> p(&hSemaphoreSeats);</p><p> p(&hMutex); </p><p><b> 在
34、取號機上取號;</b></p><p> int set=rand()%2;</p><p> Switch(set)</p><p><b> {</b></p><p> case 0:創(chuàng)建對公顧客線程;</p><p> dwCustoms++;</p>
35、<p> default: 創(chuàng)建對私顧客線程;</p><p> dwCustoms++;</p><p><b> }</b></p><p> v(&mutex);</p><p><b> 等待叫號;</b></p><p><b>
36、; 接受服務(wù);</b></p><p> v(&hSemaphorePubCus); //當(dāng)取到對私服務(wù)號時為v(&hSemaphorePriCus);</p><p><b> }</b></p><p> process B//窗口線程,分對公窗口與對私窗口,執(zhí)行過程相似,在此只寫出其中一個窗口線程<
37、;/p><p><b> { </b></p><p> P(&hSemaphorePubCus);//當(dāng)取到對私服務(wù)號是為p(&hSemaphorePriCus);</p><p> 若有顧客等待,則通過叫號為下一位顧客服務(wù);</p><p> dwCustoms--;</p>
38、<p> v(&hSemaphoreSeats);</p><p><b> 為顧客提供服務(wù)</b></p><p><b> 顧客離開;</b></p><p><b> }</b></p><p><b> 七.算法流程圖</b&
39、gt;</p><p> 八.主要數(shù)據(jù)結(jié)構(gòu)及實現(xiàn)</p><p> 通過創(chuàng)建十二個線程來實現(xiàn)銀行排隊系統(tǒng),3個對公窗口,7個對私窗口,1個對公等待顧客,1個對私等待顧客,十個窗口建立之后,來顧客就執(zhí)行,沒顧客就掛起,進入等待狀態(tài),通過設(shè)計一個隨機數(shù)來實現(xiàn)對公對私窗口的區(qū)分,服務(wù)時間可以通過設(shè)計一個隨機時間來實現(xiàn),四個信號量,其中一個互斥信號量是取號機的,因為取號機只能一個人用,其余三個
40、分別是等待室的信號量,對公和對私服務(wù)信號量,進來一個人時,先檢查座位是否滿了,沒滿,則取號,進入等待室,然后等待窗口叫號,當(dāng)服務(wù)完時,離開并釋放一個座位。</p><p> 顧客線程創(chuàng)建過程:(顧客線程分對公顧客線程與對私顧客線程,創(chuàng)建過程基本類似,下面列舉對公顧客線程創(chuàng)建過程)</p><p> DWORD WINAPI fnPriTreadFunction(LPVOID lpPar
41、ameter)</p><p><b> {</b></p><p> /*進入等待室PV操作*/</p><p> WaitForSingleObject( hSemaphoreSeats , INFINITE );</p><p> //檢查等待室有沒有空位,有則繼續(xù)</p><p>
42、 WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室,同時不允許其他顧客進入</p><p> PrivateCustomers++;</p><p> cout<<"\n第"<<PrivateCustomers<<"位對私顧客
43、進入!\n";</p><p> ReleaseMutex( hMutex );</p><p> ReleaseSemaphore( hSemaphorePrivateCustomers,1,NULL);</p><p> //釋放一個信號量使顧客可以接受服務(wù)</p><p> return 0 ;</p>
44、<p><b> }</b></p><p> 窗口線程創(chuàng)建過程:(窗口線程分3個對公窗口與7個對私窗口,創(chuàng)建過程基本類似,下面列舉對公窗口1線程創(chuàng)建過程)</p><p> DWORD WINAPI PublicSevice2(LPVOID lpParameter)</p><p><b> {</b>
45、</p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PublicCustomers <= 2)</p><p><b> {</b></p><p> cout<&l
46、t;"對公窗口2空閑!\n";</p><p><b> }</b></p><p> /*開始對公服務(wù)PV操作*/</p><p> WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p> //檢查有沒有顧客
47、等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForSingleObject(PublicSevice2 , INFINITE );</p><p><b> //開始
48、服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,室其他人可以進入</p><p> ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p> //釋放信號量使其它顧客可以進入等待室</p><
49、;p> cout<<"第"<<PublicCustomers<<"位對公顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p> cout<<"第"<<PublicCustomers<<"位對公顧客離開!\n
50、";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p><p> //釋放信號量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PublicS
51、evice2);</p><p><b> }</b></p><p><b> }</b></p><p> 九.實驗測試結(jié)果及結(jié)果分析</p><p><b> 結(jié)果分析</b></p><p> 顧客進入銀行之后,首先判斷是否有空座位,若
52、有,則在取號機上取號,等待窗口服務(wù)。對于窗口而言,只要其空閑,則按照顧客取號的順序為顧客提供服務(wù)。所有線程執(zhí)行結(jié)束之后程序結(jié)束。</p><p><b> 十.課程設(shè)計總結(jié)</b></p><p> 通過此次課程設(shè)計,對銀行排隊系統(tǒng)有了較為透徹的了解,同時也了解到了c++中許多api功能函數(shù)的運用,覺得c++真的是包含了好多好多功能,以前就以為只需要學(xué)會書上的東西
53、就行,現(xiàn)在發(fā)現(xiàn)其實不然,好多東西都是我們從實踐中學(xué)習(xí)到的,好多庫函數(shù)自己根本就不知道,感覺這次真的學(xué)到了好多,不僅僅是把銀行排隊系統(tǒng)理解了,更重要的是鞏固了以前的知識,學(xué)到了新的東西。</p><p> 回顧此次課程設(shè)計,自從拿到題目到完成整個編程,從理論到實踐,我們學(xué)到很多的知識,不僅鞏固了以前所學(xué)的知識,而且學(xué)到很多課外的知識,通過本次設(shè)計,讓我們懂得了理論與實際相結(jié)合的重要性,只有把所學(xué)的理論知識與實踐相
54、結(jié)合,才能真正提高自己的實際動手能力和獨立思考的能力。</p><p> 總之,此次課程設(shè)計給我們提供了一個既動手又動腦、自學(xué)、獨立實踐的機會,是我們養(yǎng)成自學(xué)的好習(xí)慣,鍛煉了實際分析問題和解決問題的能力,提高了適應(yīng)實際編寫的能力,為今后的學(xué)習(xí)和實踐打下良好的基礎(chǔ)。</p><p><b> 十一.源程序清單</b></p><p><
55、b> 主要代碼</b></p><p> #include <Windows.h></p><p> #include <stdio.h></p><p> #include <Winbase.h></p><p> #include <cmath></p>
56、;<p> #include <ctime></p><p> #include <iostream></p><p> using namespace std;</p><p> DWORD seat , PublicCustomers = 0,PrivateCustomers= 0,WaitCustoms=0;<
57、;/p><p> //分別設(shè)定座位的初始值,對公對私顧客窗口的初始值,等待顧客的初始值</p><p> HANDLE hMutex ,hSemaphorePublicCustomers, hSemaphorePrivateCustomers , hSemaphoreSeats ;</p><p> //分別設(shè)定取號機的互斥量,等待對公服務(wù)顧客的數(shù)量,等待對私服
58、務(wù)顧客的數(shù)量和等待室剩余座位數(shù)的信號量</p><p> DWORD WINAPI fnPubTreadFunction(LPVOID lpParameter)</p><p><b> {</b></p><p> /*進入等待室PV操作*/</p><p> WaitForSingleObject( hSem
59、aphoreSeats , INFINITE );</p><p> //檢查等待室有沒有空位,有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室,同時不允許其他顧客進入</p><p> PublicCustomers++;</p&g
60、t;<p> cout<<"\n第"<<PublicCustomers<<"位對公顧客進入!\n";</p><p> ReleaseMutex( hMutex );</p><p> //創(chuàng)建對公服務(wù)窗口線程</p><p> ReleaseSemaphore( hS
61、emaphorePublicCustomers,1,NULL);</p><p><b> return 0;</b></p><p><b> }</b></p><p> DWORD WINAPI fnPriTreadFunction(LPVOID lpParameter)</p><p>
62、;<b> {</b></p><p> /*進入等待室PV操作*/</p><p> WaitForSingleObject( hSemaphoreSeats , INFINITE );</p><p> //檢查等待室有沒有空位,有則繼續(xù)</p><p> WaitForSingleObject( hMut
63、ex , INFINITE );</p><p> //進入等待室,同時不允許其他顧客進入</p><p> PrivateCustomers++;</p><p> cout<<"\n第"<<PrivateCustomers<<"位對私顧客進入!\n";</p><
64、;p> ReleaseMutex( hMutex );</p><p> ReleaseSemaphore( hSemaphorePrivateCustomers,1,NULL);</p><p> //釋放一個信號量使顧客可以接受服務(wù)</p><p> return 0 ;</p><p><b> }</b
65、></p><p> DWORD WINAPI PublicSevice1(LPVOID lpParameter)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p>
66、<p> if (PublicCustomers <= 1)</p><p><b> {</b></p><p> cout<<"對公窗口1空閑!\n";</p><p><b> }</b></p><p> /*開始對公服務(wù)PV操作*
67、/</p><p> WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時
68、不允許其他顧客進入</p><p> WaitForSingleObject(PublicSevice1 , INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,室其他人可以進入</p&g
69、t;<p> ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PublicCustomers<<"位對公顧客正在服務(wù)!\n";</p><
70、p> //窗口正在服務(wù),服務(wù)延時</p><p> cout<<"第"<<PublicCustomers<<"位對公顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> Rele
71、aseMutex( hSemaphoreSeats );</p><p> //釋放信號量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PublicSevice1);</p><p><b> }</b></p><p><b> }</b></p>
72、<p> DWORD WINAPI PublicSevice2(LPVOID lpParameter)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if
73、(PublicCustomers <= 2)</p><p><b> {</b></p><p> cout<<"對公窗口2空閑!\n";</p><p><b> }</b></p><p> /*開始對公服務(wù)PV操作*/</p>&l
74、t;p> WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p
75、><p> WaitForSingleObject(PublicSevice2 , INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,室其他人可以進入</p><p>
76、 ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PublicCustomers<<"位對公顧客正在服務(wù)!\n";</p><p> //窗口正在服
77、務(wù),服務(wù)延時</p><p> cout<<"第"<<PublicCustomers<<"位對公顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSem
78、aphoreSeats );</p><p> //釋放信號量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PublicSevice2);</p><p><b> }</b></p><p><b> }</b></p><p> DW
79、ORD WINAPI PublicSevice3(LPVOID lpParameter)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PublicCustome
80、rs <= 3)</p><p><b> {</b></p><p> cout<<"對公窗口3空閑!\n";</p><p><b> }</b></p><p> /*開始對公服務(wù)PV操作*/</p><p> WaitF
81、orSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p>
82、; WaitForSingleObject(PublicSevice3 , INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,室其他人可以進入</p><p> ReleaseSemaph
83、ore( hSemaphoreSeats ,1,NULL);</p><p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PublicCustomers<<"位對公顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p&g
84、t;<p> cout<<"第"<<PublicCustomers<<"位對公顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );
85、</p><p> //釋放信號量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PublicSevice3);</p><p><b> }</b></p><p><b> }</b></p><p> DWORD WINAPI Pri
86、vateSevice1(LPVOID lpParameter)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PrivateCustomers <= 1)&
87、lt;/p><p><b> {</b></p><p> cout<<"對私窗口1空閑!\n";</p><p><b> }</b></p><p> /*開始對私服務(wù)PV操作*/</p><p> WaitForSingleObje
88、ct( hSemaphorePrivateCustomers , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForS
89、ingleObject(PrivateSevice1 , INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,使其他人可以進入</p><p> ReleaseSemaphore( hSema
90、phoreSeats ,1,NULL);</p><p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PrivateCustomers<<"位對私顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p
91、> cout<<"第"<<PrivateCustomers<<"位對私顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p&g
92、t;<p> //釋放信號量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PrivateSevice1);</p><p><b> }</b></p><p><b> }</b></p><p> DWORD WINAPI PrivateSev
93、ice2(LPVOID lpParameter)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PrivateCustomers <= 2)</p&g
94、t;<p><b> {</b></p><p> cout<<"對私窗口2空閑!\n";</p><p><b> }</b></p><p> /*開始對私服務(wù)PV操作*/</p><p> WaitForSingleObject( hSe
95、maphorePrivateCustomers , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForSingleOb
96、ject(PrivateSevice2 , INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,使其他人可以進入</p><p> ReleaseSemaphore( hSemaphoreSe
97、ats ,1,NULL);</p><p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PrivateCustomers<<"位對私顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p> c
98、out<<"第"<<PrivateCustomers<<"位對私顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p><
99、;p> //釋放信號量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PrivateSevice2);</p><p><b> }</b></p><p><b> }</b></p><p> DWORD WINAPI PrivateSevice3(LP
100、VOID lpParameter)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PrivateCustomers <= 3)</p><
101、;p><b> {</b></p><p> cout<<"對私窗口3空閑!\n";</p><p><b> }</b></p><p> /*開始對私服務(wù)PV操作*/</p><p> WaitForSingleObject( hSemaphore
102、PrivateCustomers , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForSingleObject(Pr
103、ivateSevice3 , INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,使其他人可以進入</p><p> ReleaseSemaphore( hSemaphoreSeats ,1,
104、NULL);</p><p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PrivateCustomers<<"位對私顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p> cout<
105、<"第"<<PrivateCustomers<<"位對私顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p><p>
106、 //釋放信號量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PrivateSevice3);</p><p><b> }</b></p><p><b> }</b></p><p> DWORD WINAPI PrivateSevice4(LPVOID lp
107、Parameter)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PrivateCustomers <= 4)</p><p>&
108、lt;b> {</b></p><p> cout<<"對私窗口4空閑!\n";</p><p><b> }</b></p><p> /*開始對私服務(wù)PV操作*/</p><p> WaitForSingleObject( hSemaphorePrivate
109、Customers , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForSingleObject(PrivateSe
110、vice4 , INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,使其他人可以進入</p><p> ReleaseSemaphore( hSemaphoreSeats ,1,NULL);&
111、lt;/p><p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PrivateCustomers<<"位對私顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p> cout<<&qu
112、ot;第"<<PrivateCustomers<<"位對私顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p><p> //釋放信號
113、量使其它顧客可以到達窗口接受服務(wù)</p><p> CloseHandle(PrivateSevice4);</p><p><b> }</b></p><p><b> }</b></p><p> DWORD WINAPI PrivateSevice5(LPVOID lpParamet
114、er)</p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PrivateCustomers <= 5)</p><p><b>
115、; {</b></p><p> cout<<"對私窗口5空閑!\n";</p><p><b> }</b></p><p> /*開始對私服務(wù)PV操作*/</p><p> WaitForSingleObject( hSemaphorePrivateCustome
116、rs , INFINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForSingleObject(PrivateSevice5
117、, INFINITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,使其他人可以進入</p><p> ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p&g
118、t;<p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PrivateCustomers<<"位對私顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p> cout<<"第&qu
119、ot;<<PrivateCustomers<<"位對私顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p><p> //釋放信號量使其它顧客可
120、以到達窗口接受服務(wù)</p><p> CloseHandle(PrivateSevice5);</p><p><b> }</b></p><p><b> }</b></p><p> DWORD WINAPI PrivateSevice6(LPVOID lpParameter)<
121、/p><p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PrivateCustomers <= 6)</p><p><b> {<
122、;/b></p><p> cout<<"對私窗口6空閑!\n";</p><p><b> }</b></p><p> /*開始對私服務(wù)PV操作*/</p><p> WaitForSingleObject( hSemaphorePrivateCustomers , IN
123、FINITE );</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForSingleObject(PrivateSevice6 , INFIN
124、ITE );</p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,使其他人可以進入</p><p> ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><
125、;p> //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PrivateCustomers<<"位對私顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p> cout<<"第"<
126、<PrivateCustomers<<"位對私顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p><p> //釋放信號量使其它顧客可以到達窗口接受
127、服務(wù)</p><p> CloseHandle(PrivateSevice6);</p><p><b> }</b></p><p><b> }</b></p><p> DWORD WINAPI PrivateSevice7(LPVOID lpParameter)</p>
128、<p><b> {</b></p><p><b> while(1)</b></p><p><b> {</b></p><p> if (PrivateCustomers <= 7)</p><p><b> {</b>
129、</p><p> cout<<"對私窗口7空閑!\n";</p><p><b> }</b></p><p> /*開始對私服務(wù)PV操作*/</p><p> WaitForSingleObject( hSemaphorePrivateCustomers , INFINITE
130、);</p><p> //檢查有沒有顧客等待服務(wù),有則繼續(xù)</p><p> WaitForSingleObject( hMutex , INFINITE );</p><p> //進入等待室時不允許其他顧客進入</p><p> WaitForSingleObject(PrivateSevice7 , INFINITE );&
131、lt;/p><p><b> //開始服務(wù)</b></p><p> ReleaseMutex( hMutex );</p><p> //釋放互斥量,使其他人可以進入</p><p> ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p>
132、 //釋放信號量使其它顧客可以進入等待室</p><p> cout<<"第"<<PrivateCustomers<<"位對私顧客正在服務(wù)!\n";</p><p> //窗口正在服務(wù),服務(wù)延時</p><p> cout<<"第"<<Pri
133、vateCustomers<<"位對私顧客離開!\n";</p><p> WaitCustoms--;</p><p> //記錄顧客離開的序號</p><p> ReleaseMutex( hSemaphoreSeats );</p><p> //釋放信號量使其它顧客可以到達窗口接受服務(wù)</
134、p><p> CloseHandle(PrivateSevice7);</p><p><b> }</b></p><p><b> }</b></p><p> void main()</p><p><b> {</b></p>
135、<p> HANDLE hPublicCustomerstomersThread,hPrivateCustomerstomersThread ;</p><p> //創(chuàng)建公有私有線程服務(wù)線程句柄</p><p> HANDLE hPublicSevice1,hPublicSevice2,hPublicSevice3,hPrivateSevice1,hPrivateSev
136、ice2,hPrivateSevice3,hPrivateSevice4,hPrivateSevice5,hPrivateSevice6,hPrivateSevice7;</p><p> cout<<"****************************歡迎來到中國銀行!?。?*****************************"<<endl;</p
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計--進程通信與進程同步機制實踐
- 操作系統(tǒng)課程設(shè)計--進程通信與進程同步機制實踐
- 并發(fā)進程同步算法的設(shè)計方法
- 進程同步模擬課程設(shè)計——司機和售票員問題
- 進程同步經(jīng)典習(xí)題
- 操作系統(tǒng)課程設(shè)計報告—多進程同步橘子蘋果問題
- 進程同步典型例題操作系統(tǒng)
- 進程模擬調(diào)度算法課程設(shè)計
- 進程調(diào)度算法 操作系統(tǒng)課程設(shè)計
- KVM系統(tǒng)通信和同步機制的設(shè)計與實現(xiàn).pdf
- 操作系統(tǒng)課程設(shè)計--進程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計---進程調(diào)度算法
- 進程調(diào)度算法操作系統(tǒng)課程設(shè)計
- 操作系統(tǒng)課程設(shè)計--進程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計--進程的軟中斷通信與管道通信
- 【全套設(shè)計】課程設(shè)計-模擬進程利用雙向郵箱通信
- 售票員和汽車司機的進程同步問題
- 進程調(diào)度算法操作系統(tǒng)課程設(shè)計 (2)
- 操作系統(tǒng)課程設(shè)計——進程調(diào)度模擬算法
- 操作系統(tǒng)_進程調(diào)度算法課程設(shè)計報告
評論
0/150
提交評論