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

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論