算法課程設(shè)計(jì)---進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)現(xiàn)_第1頁(yè)
已閱讀1頁(yè),還剩22頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p>  《操作系統(tǒng)》課程設(shè)計(jì)說(shuō)明書</p><p>  設(shè)計(jì)題目 進(jìn)程通信與進(jìn)程同步機(jī)制實(shí)現(xiàn) </p><p>  學(xué)生姓名 </p><p>  指導(dǎo)老師 </p><p>  學(xué) 院

2、 </p><p>  專業(yè)班級(jí) 軟件工程1002班 </p><p>  學(xué)號(hào) </p><p>  完成時(shí)間 2013年1月9日 </p><

3、p><b>  課程設(shè)計(jì)題目</b></p><p>  某銀行提供10個(gè)服務(wù)窗口(7個(gè)對(duì)私服務(wù)窗口,3個(gè)對(duì)公服務(wù)窗口)和100個(gè)供顧客等待的座位。顧客到達(dá)銀行時(shí),若有空座位,則到取號(hào)機(jī)上領(lǐng)取一個(gè)號(hào),等待叫號(hào)。取號(hào)機(jī)每次僅允許一位顧客使用,有對(duì)公和對(duì)私兩類號(hào),美味顧客只能選取其中一個(gè)。當(dāng)營(yíng)業(yè)員空閑時(shí),通過(guò)叫號(hào)選取一位顧客,并為其服務(wù)。請(qǐng)用P、V操作寫出進(jìn)程的同步算法。</p>

4、;<p><b>  課程設(shè)計(jì)目的</b></p><p>  1、掌握基本的同步與互斥算法,理解銀行排隊(duì)系統(tǒng)操作模型。</p><p>  2、學(xué)習(xí)使用Windows 2000/XP中基本的同步對(duì)象,掌握相關(guān)API的使用方法。</p><p>  3、了解Windows 2000/XP中多線程的并發(fā)執(zhí)行機(jī)制,實(shí)現(xiàn)進(jìn)程的同步與互斥

5、。</p><p><b>  三.課程設(shè)計(jì)要求</b></p><p>  ◆學(xué)習(xí)并理解生產(chǎn)者/消費(fèi)者模型及其同步/互斥規(guī)則;</p><p>  ◆學(xué)習(xí)了解Windows同步對(duì)象及其特性;</p><p>  ◆熟悉實(shí)驗(yàn)環(huán)境,掌握相關(guān)API的使用方法;</p><p>  ◆設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)

6、者/消費(fèi)者進(jìn)程(線程)的同步與互斥;</p><p><b>  ◆提交實(shí)驗(yàn)報(bào)告。</b></p><p><b>  四.需要了解的知識(shí)</b></p><p><b>  1.同步對(duì)象</b></p><p>  同步對(duì)象是指Windows中用于實(shí)現(xiàn)同步與互斥的實(shí)體,包括信

7、號(hào)量(Semaphore)、互斥量(Mutex)、臨界區(qū)(Critical Section)和事件(Events)等。本實(shí)驗(yàn)中使用到信號(hào)量、互斥量和臨界區(qū)三個(gè)同步對(duì)象。</p><p>  2.同步對(duì)象的使用步驟:</p><p>  ◆創(chuàng)建/初始化同步對(duì)象。</p><p>  ◆請(qǐng)求同步對(duì)象,進(jìn)入臨界區(qū)(互斥量上鎖)。</p><p> 

8、 ◆釋放同步對(duì)象(互斥量解鎖)。</p><p>  五.需要用到的API函數(shù)及相關(guān)函數(shù)</p><p>  我們利用Windows SDK提供的API編程實(shí)現(xiàn)實(shí)驗(yàn)題目要求,而VC中包含有Windows SDK的所有工具和定義。要使用這些API,需要包含堆這些函數(shù)進(jìn)行說(shuō)明的SDK頭文件——最常見(jiàn)的是Windows.h(特殊的API調(diào)用還需要包含其他頭文件)。</p><

9、p>  本實(shí)驗(yàn)使用到的API的功能和使用方法簡(jiǎn)單介紹</p><p>  1、WaitForSingleObject( hSemaphoreChairs , INFINITE );</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  功能——使程序處于等待狀態(tài),直到信號(hào)量hHandle出現(xiàn)

10、(即其值大于等于1)或超過(guò)規(guī)定的等待時(shí)間</p><p><b>  格式</b></p><p>  DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);</p><p><b>  參數(shù)說(shuō)明</b></p><p>  

11、hHandle——信號(hào)量指針。</p><p>  dwMilliseconds——等待的最長(zhǎng)時(shí)間(INFINITE為無(wú)限等待)。</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>  功能——對(duì)指定信號(hào)量加上一個(gè)指定大小的量。成功執(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ù)說(shuō)明</b></p><p>

14、;  hSemaphore——信號(hào)量指針。</p><p>  lReleaseCount——信號(hào)量的增量。</p><p>  lppreviousCount——保存信號(hào)量當(dāng)前值。</p><p>  3、hShoppersThread = CreateThread ( NULL ,0 , fnTreadFunction ,NULL , 0 ,NULL );&l

15、t;/p><p>  CreateThread</p><p>  功能——?jiǎng)?chuàng)建一個(gè)在調(diào)用進(jìn)程的地址空間中執(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ù)說(shuō)明</b></p><p>  lpThreadAttributes——指向一個(gè)LPSECURITY_ATTRIBUTES(新線程的安全性描述符)。</p><p>  dwStackSize——定義原始堆棧大小。</p><p>  lpStartAddress——指向使用LPTH

18、RAED_START_ROUTINE類型定義的函數(shù)。</p><p>  lpParamiter——定義一個(gè)給進(jìn)程傳遞參數(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>  功能——?jiǎng)?chuàng)建一個(gè)命名或匿名的互斥量對(duì)象</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>  功能——?jiǎng)?chuàng)建一個(gè)命名或匿名的信號(hào)量對(duì)象</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ù)說(shuō)明</b></p><p>  lpSemaphoreAttributes——必須取值NULL。</p><p>  lInitialCount——信號(hào)量的初始值。該值大于0,但小于lMaximumCount指定的最大值。</p><p>  lMaximumCount——信號(hào)量的最大值。</p><p>  lpNam

24、e——信號(hào)量名稱。</p><p>  hBarberThread = CreateThread ( NULL ,0 , fnBarberFunction ,NULL , 0 ,NULL );</p><p>  功能——?jiǎng)?chuàng)建一個(gè)在調(diào)用進(jìn)程的地址空間中執(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ù)說(shuō)明</b></p><p>  lpThreadAttributes——指向一個(gè)LPSECURITY_ATTRIBUTES(新線程的安全性描述符)。</p><

27、p>  dwStackSize——定義原始堆棧大小。</p><p>  lpStartAddress——指向使用LPTHRAED_START_ROUTINE類型定義的函數(shù)。</p><p>  lpParamiter——定義一個(gè)給進(jìn)程傳遞參數(shù)的指針。</p><p>  dwCreationFlags——定義控制線程創(chuàng)建的附加標(biāo)志。</p>&

28、lt;p>  lpThread——保存線程標(biāo)志符(32位)</p><p><b>  六.原理及算法</b></p><p><b>  1、信號(hào)量設(shè)置</b></p><p>  hMutex:取號(hào)機(jī)互斥信號(hào)量</p><p>  hSemaphorePubCus:等待對(duì)公服務(wù)顧客的數(shù)量&

29、lt;/p><p>  hSemaphorePriCus:等待對(duì)私服務(wù)顧客的數(shù)量</p><p>  hSemaphoreSeats:剩余空座位的數(shù)量</p><p><b>  2、線程創(chuàng)建</b></p><p>  fnPubser1,fnPubser2,fnPubser3:3個(gè)對(duì)公窗口線程</p>&l

30、t;p>  fnPriser1,fnPriser2,fnPriser3,fnPriser4,fnPriser5,fnPriser6,</p><p>  fnPriser7:7個(gè)對(duì)私窗口線程</p><p>  fnPubTreadFunction:對(duì)公顧客線程</p><p>  fnPriTreadFunction:對(duì)私顧客線程</p>&l

31、t;p>  seat :可用座位數(shù)量 </p><p>  Pubcus=0:初始對(duì)公顧客等待數(shù)量</p><p>  Pricus=0:初始對(duì)私顧客等待數(shù)量</p><p>  dwCustoms=0:初始顧客排隊(duì)數(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、取號(hào)機(jī)上取號(hào);</b></p><p>  int set=rand()%2;</p><p>  Switch(set)</p><p><b>  {</b></p><p>  case 0:創(chuàng)建對(duì)公顧客線程;</p><p>  dwCustoms++;</p>

35、<p>  default: 創(chuàng)建對(duì)私顧客線程;</p><p>  dwCustoms++;</p><p><b>  }</b></p><p>  v(&mutex);</p><p><b>  等待叫號(hào);</b></p><p><b>

36、;  接受服務(wù);</b></p><p>  v(&hSemaphorePubCus); //當(dāng)取到對(duì)私服務(wù)號(hào)時(shí)為v(&hSemaphorePriCus);</p><p><b>  }</b></p><p>  process B//窗口線程,分對(duì)公窗口與對(duì)私窗口,執(zhí)行過(guò)程相似,在此只寫出其中一個(gè)窗口線程<

37、;/p><p><b>  { </b></p><p>  P(&hSemaphorePubCus);//當(dāng)取到對(duì)私服務(wù)號(hào)是為p(&hSemaphorePriCus);</p><p>  若有顧客等待,則通過(guò)叫號(hào)為下一位顧客服務(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)及實(shí)現(xiàn)</p><p>  通過(guò)創(chuàng)建十二個(gè)線程來(lái)實(shí)現(xiàn)銀行排隊(duì)系統(tǒng),3個(gè)對(duì)公窗口,7個(gè)對(duì)私窗口,1個(gè)對(duì)公等待顧客,1個(gè)對(duì)私等待顧客,十個(gè)窗口建立之后,來(lái)顧客就執(zhí)行,沒(méi)顧客就掛起,進(jìn)入等待狀態(tài),通過(guò)設(shè)計(jì)一個(gè)隨機(jī)數(shù)來(lái)實(shí)現(xiàn)對(duì)公對(duì)私窗口的區(qū)分,服務(wù)時(shí)間可以通過(guò)設(shè)計(jì)一個(gè)隨機(jī)時(shí)間來(lái)實(shí)現(xiàn),四個(gè)信號(hào)量,其中一個(gè)互斥信號(hào)量是取號(hào)機(jī)的,因?yàn)槿√?hào)機(jī)只能一個(gè)人用,其余三個(gè)

40、分別是等待室的信號(hào)量,對(duì)公和對(duì)私服務(wù)信號(hào)量,進(jìn)來(lái)一個(gè)人時(shí),先檢查座位是否滿了,沒(méi)滿,則取號(hào),進(jìn)入等待室,然后等待窗口叫號(hào),當(dāng)服務(wù)完時(shí),離開并釋放一個(gè)座位。</p><p>  顧客線程創(chuàng)建過(guò)程:(顧客線程分對(duì)公顧客線程與對(duì)私顧客線程,創(chuàng)建過(guò)程基本類似,下面列舉對(duì)公顧客線程創(chuàng)建過(guò)程)</p><p>  DWORD WINAPI fnPriTreadFunction(LPVOID lpPar

41、ameter)</p><p><b>  {</b></p><p>  /*進(jìn)入等待室PV操作*/</p><p>  WaitForSingleObject( hSemaphoreSeats , INFINITE );</p><p>  //檢查等待室有沒(méi)有空位,有則繼續(xù)</p><p>

42、  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室,同時(shí)不允許其他顧客進(jìn)入</p><p>  PrivateCustomers++;</p><p>  cout<<"\n第"<<PrivateCustomers<<"位對(duì)私顧客

43、進(jìn)入!\n";</p><p>  ReleaseMutex( hMutex );</p><p>  ReleaseSemaphore( hSemaphorePrivateCustomers,1,NULL);</p><p>  //釋放一個(gè)信號(hào)量使顧客可以接受服務(wù)</p><p>  return 0 ;</p>

44、<p><b>  }</b></p><p>  窗口線程創(chuàng)建過(guò)程:(窗口線程分3個(gè)對(duì)公窗口與7個(gè)對(duì)私窗口,創(chuàng)建過(guò)程基本類似,下面列舉對(duì)公窗口1線程創(chuàng)建過(guò)程)</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;"對(duì)公窗口2空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)公服務(wù)PV操作*/</p><p>  WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p>  //檢查有沒(méi)有顧客

47、等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForSingleObject(PublicSevice2 , INFINITE );</p><p><b>  //開始

48、服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,室其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><

49、;p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客離開!\n

50、";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p><p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(wù)</p><p>  CloseHandle(PublicS

51、evice2);</p><p><b>  }</b></p><p><b>  }</b></p><p>  九.實(shí)驗(yàn)測(cè)試結(jié)果及結(jié)果分析</p><p><b>  結(jié)果分析</b></p><p>  顧客進(jìn)入銀行之后,首先判斷是否有空座位,若

52、有,則在取號(hào)機(jī)上取號(hào),等待窗口服務(wù)。對(duì)于窗口而言,只要其空閑,則按照顧客取號(hào)的順序?yàn)轭櫩吞峁┓?wù)。所有線程執(zhí)行結(jié)束之后程序結(jié)束。</p><p><b>  十.課程設(shè)計(jì)總結(jié)</b></p><p>  通過(guò)此次課程設(shè)計(jì),對(duì)銀行排隊(duì)系統(tǒng)有了較為透徹的了解,同時(shí)也了解到了c++中許多api功能函數(shù)的運(yùn)用,覺(jué)得c++真的是包含了好多好多功能,以前就以為只需要學(xué)會(huì)書上的東西

53、就行,現(xiàn)在發(fā)現(xiàn)其實(shí)不然,好多東西都是我們從實(shí)踐中學(xué)習(xí)到的,好多庫(kù)函數(shù)自己根本就不知道,感覺(jué)這次真的學(xué)到了好多,不僅僅是把銀行排隊(duì)系統(tǒng)理解了,更重要的是鞏固了以前的知識(shí),學(xué)到了新的東西。</p><p>  回顧此次課程設(shè)計(jì),自從拿到題目到完成整個(gè)編程,從理論到實(shí)踐,我們學(xué)到很多的知識(shí),不僅鞏固了以前所學(xué)的知識(shí),而且學(xué)到很多課外的知識(shí),通過(guò)本次設(shè)計(jì),讓我們懂得了理論與實(shí)際相結(jié)合的重要性,只有把所學(xué)的理論知識(shí)與實(shí)踐相

54、結(jié)合,才能真正提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。</p><p>  總之,此次課程設(shè)計(jì)給我們提供了一個(gè)既動(dòng)手又動(dòng)腦、自學(xué)、獨(dú)立實(shí)踐的機(jī)會(huì),是我們養(yǎng)成自學(xué)的好習(xí)慣,鍛煉了實(shí)際分析問(wèn)題和解決問(wèn)題的能力,提高了適應(yīng)實(shí)際編寫的能力,為今后的學(xué)習(xí)和實(shí)踐打下良好的基礎(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è)定座位的初始值,對(duì)公對(duì)私顧客窗口的初始值,等待顧客的初始值</p><p>  HANDLE hMutex ,hSemaphorePublicCustomers, hSemaphorePrivateCustomers , hSemaphoreSeats ;</p><p>  //分別設(shè)定取號(hào)機(jī)的互斥量,等待對(duì)公服務(wù)顧客的數(shù)量,等待對(duì)私服

58、務(wù)顧客的數(shù)量和等待室剩余座位數(shù)的信號(hào)量</p><p>  DWORD WINAPI fnPubTreadFunction(LPVOID lpParameter)</p><p><b>  {</b></p><p>  /*進(jìn)入等待室PV操作*/</p><p>  WaitForSingleObject( hSem

59、aphoreSeats , INFINITE );</p><p>  //檢查等待室有沒(méi)有空位,有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室,同時(shí)不允許其他顧客進(jìn)入</p><p>  PublicCustomers++;</p&g

60、t;<p>  cout<<"\n第"<<PublicCustomers<<"位對(duì)公顧客進(jìn)入!\n";</p><p>  ReleaseMutex( hMutex );</p><p>  //創(chuàng)建對(duì)公服務(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>  /*進(jìn)入等待室PV操作*/</p><p>  WaitForSingleObject( hSemaphoreSeats , INFINITE );</p><p>  //檢查等待室有沒(méi)有空位,有則繼續(xù)</p><p>  WaitForSingleObject( hMut

63、ex , INFINITE );</p><p>  //進(jìn)入等待室,同時(shí)不允許其他顧客進(jìn)入</p><p>  PrivateCustomers++;</p><p>  cout<<"\n第"<<PrivateCustomers<<"位對(duì)私顧客進(jìn)入!\n";</p><

64、;p>  ReleaseMutex( hMutex );</p><p>  ReleaseSemaphore( hSemaphorePrivateCustomers,1,NULL);</p><p>  //釋放一個(gè)信號(hào)量使顧客可以接受服務(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<<"對(duì)公窗口1空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)公服務(wù)PV操作*

67、/</p><p>  WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)

68、不允許其他顧客進(jìn)入</p><p>  WaitForSingleObject(PublicSevice1 , INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,室其他人可以進(jìn)入</p&g

69、t;<p>  ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客正在服務(wù)!\n";</p><

70、p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  Rele

71、aseMutex( hSemaphoreSeats );</p><p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(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<<"對(duì)公窗口2空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)公服務(wù)PV操作*/</p>&l

74、t;p>  WaitForSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p

75、><p>  WaitForSingleObject(PublicSevice2 , INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,室其他人可以進(jìn)入</p><p> 

76、 ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客正在服務(wù)!\n";</p><p>  //窗口正在服

77、務(wù),服務(wù)延時(shí)</p><p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSem

78、aphoreSeats );</p><p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(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<<"對(duì)公窗口3空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)公服務(wù)PV操作*/</p><p>  WaitF

81、orSingleObject( hSemaphorePublicCustomers , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>

82、;  WaitForSingleObject(PublicSevice3 , INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,室其他人可以進(jìn)入</p><p>  ReleaseSemaph

83、ore( hSemaphoreSeats ,1,NULL);</p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p&g

84、t;<p>  cout<<"第"<<PublicCustomers<<"位對(duì)公顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );

85、</p><p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(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<<"對(duì)私窗口1空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)私服務(wù)PV操作*/</p><p>  WaitForSingleObje

88、ct( hSemaphorePrivateCustomers , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForS

89、ingleObject(PrivateSevice1 , INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,使其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSema

90、phoreSeats ,1,NULL);</p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p

91、>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p&g

92、t;<p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(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<<"對(duì)私窗口2空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)私服務(wù)PV操作*/</p><p>  WaitForSingleObject( hSe

95、maphorePrivateCustomers , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForSingleOb

96、ject(PrivateSevice2 , INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,使其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSemaphoreSe

97、ats ,1,NULL);</p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  c

98、out<<"第"<<PrivateCustomers<<"位對(duì)私顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p><

99、;p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(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<<"對(duì)私窗口3空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)私服務(wù)PV操作*/</p><p>  WaitForSingleObject( hSemaphore

102、PrivateCustomers , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForSingleObject(Pr

103、ivateSevice3 , INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,使其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSemaphoreSeats ,1,

104、NULL);</p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  cout<

105、<"第"<<PrivateCustomers<<"位對(duì)私顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p><p> 

106、 //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(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<<"對(duì)私窗口4空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)私服務(wù)PV操作*/</p><p>  WaitForSingleObject( hSemaphorePrivate

109、Customers , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForSingleObject(PrivateSe

110、vice4 , INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,使其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSemaphoreSeats ,1,NULL);&

111、lt;/p><p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  cout<<&qu

112、ot;第"<<PrivateCustomers<<"位對(duì)私顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p><p>  //釋放信號(hào)

113、量使其它顧客可以到達(dá)窗口接受服務(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<<"對(duì)私窗口5空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)私服務(wù)PV操作*/</p><p>  WaitForSingleObject( hSemaphorePrivateCustome

116、rs , INFINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForSingleObject(PrivateSevice5

117、, INFINITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,使其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p&g

118、t;<p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  cout<<"第&qu

119、ot;<<PrivateCustomers<<"位對(duì)私顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p><p>  //釋放信號(hào)量使其它顧客可

120、以到達(dá)窗口接受服務(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<<"對(duì)私窗口6空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)私服務(wù)PV操作*/</p><p>  WaitForSingleObject( hSemaphorePrivateCustomers , IN

123、FINITE );</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForSingleObject(PrivateSevice6 , INFIN

124、ITE );</p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,使其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><

125、;p>  //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  cout<<"第"<

126、<PrivateCustomers<<"位對(duì)私顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p><p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受

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<<"對(duì)私窗口7空閑!\n";</p><p><b>  }</b></p><p>  /*開始對(duì)私服務(wù)PV操作*/</p><p>  WaitForSingleObject( hSemaphorePrivateCustomers , INFINITE

130、);</p><p>  //檢查有沒(méi)有顧客等待服務(wù),有則繼續(xù)</p><p>  WaitForSingleObject( hMutex , INFINITE );</p><p>  //進(jìn)入等待室時(shí)不允許其他顧客進(jìn)入</p><p>  WaitForSingleObject(PrivateSevice7 , INFINITE );&

131、lt;/p><p><b>  //開始服務(wù)</b></p><p>  ReleaseMutex( hMutex );</p><p>  //釋放互斥量,使其他人可以進(jìn)入</p><p>  ReleaseSemaphore( hSemaphoreSeats ,1,NULL);</p><p> 

132、 //釋放信號(hào)量使其它顧客可以進(jìn)入等待室</p><p>  cout<<"第"<<PrivateCustomers<<"位對(duì)私顧客正在服務(wù)!\n";</p><p>  //窗口正在服務(wù),服務(wù)延時(shí)</p><p>  cout<<"第"<<Pri

133、vateCustomers<<"位對(duì)私顧客離開!\n";</p><p>  WaitCustoms--;</p><p>  //記錄顧客離開的序號(hào)</p><p>  ReleaseMutex( hSemaphoreSeats );</p><p>  //釋放信號(hào)量使其它顧客可以到達(dá)窗口接受服務(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<<"****************************歡迎來(lái)到中國(guó)銀行!??!******************************"<<endl;</p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論