【轉】用pv操作實現 吃水果問題


原文地址:http://blog.csdn.net/wwj_748/article/details/7455705

吃水果問題:桌子有一只盤子,只允許放一個水果,父親專向盤子放蘋果,母親專向盤子放桔子 兒子專等吃盤子的桔子,女兒專等吃盤子的蘋果。只要盤子為空,父親或母親就可以向盤子放水果, 僅當盤子有自己需要的水果時,兒子和女兒可從盤子取出。請給出四個人之間的同步關系,並用 pv操作實現四個人的正確活動的問題。  

題目分析:父親和女兒是相互制約的,父親進程執行完即往盤中放入蘋果后,女兒進程才能執行即吃蘋果,是同步關系; 母親和兒子是相互制約的,母親進程執行完即往盤中放入桔子,兒子進程才能執行即吃桔子,也是同步關系 而父親和母親這兩個進程不能同時進行,是互斥關系。

代碼:

  1 #include<windows.h>  
  2 #include<iostream>  
  3 using namespace std;  
  4   
  5   
  6 //聲明句柄  
  7 HANDLE EmptyPlate;  
  8 HANDLE Apple;  
  9 HANDLE orange;  
 10 HANDLE fatherThread;  
 11 HANDLE motherThread;  
 12 HANDLE sonThread;  
 13 HANDLE daughterThread;  
 14   
 15   
 16 //線程函數聲明  
 17 DWORD WINAPI father(LPVOID IpParameter);  
 18 DWORD WINAPI mother(LPVOID IpParameter);  
 19 DWORD WINAPI daughter(LPVOID IpParameter);  
 20 DWORD WINAPI son(LPVOID IpParameter);  
 21   
 22   
 23 int main()  
 24 {  
 25     //創建信號量  
 26     EmptyPlate = CreateSemaphore(NULL,1,1,NULL);  //盤子  
 27     Apple = CreateSemaphore(NULL,0,1,NULL); //蘋果  
 28     orange = CreateSemaphore(NULL,0,1,NULL); //桔子  
 29   
 30     //創建線程  
 31     fatherThread = CreateThread(NULL,0,father,NULL,0,NULL);  
 32     motherThread = CreateThread(NULL,0,mother,NULL,0,NULL);  
 33     daughterThread = CreateThread(NULL,0,daughter,NULL,0,NULL);  
 34     sonThread = CreateThread(NULL,0,son,NULL,0,NULL);  
 35       
 36   
 37   
 38     //等線程的結束  
 39     WaitForSingleObject(fatherThread,INFINITE);   
 40     WaitForSingleObject(motherThread,INFINITE);   
 41     WaitForSingleObject(daughterThread,INFINITE);   
 42     WaitForSingleObject(sonThread,INFINITE);   
 43   
 44     //關閉線程句柄  
 45     CloseHandle(fatherThread);    
 46     CloseHandle(motherThread);  
 47     CloseHandle(daughterThread);  
 48     CloseHandle(sonThread);  
 49   
 50     //關閉信號量句柄  
 51     CloseHandle(EmptyPlate);      
 52     CloseHandle(Apple);  
 53     CloseHandle(orange);  
 54     return 0;     
 55   
 56 }  
 57   
 58   
 59     //父親線程函數  
 60     DWORD WINAPI father(LPVOID IpParameter)  
 61     {  
 62         for(int i = 0; i < 5; ++i){  
 63         WaitForSingleObject(EmptyPlate, INFINITE);  // P操作  
 64         // 開始臨界區  
 65         cout << "\nFather往盤中放一個水果\n";  
 66         // 結束臨界區  
 67         ReleaseSemaphore(Apple, 1, NULL);   // V操作  
 68         }  
 69         return 0;  
 70     }  
 71   
 72     //母親線程函數  
 73     DWORD WINAPI mother(LPVOID IpParmeter)  
 74     {  
 75       
 76     for(int i = 0; i < 5; ++i){  
 77         WaitForSingleObject(EmptyPlate, INFINITE);  // P操作  
 78         // 開始臨界區  
 79         cout << "\nMother往盤中放一個桔子\n";  
 80         // 結束臨界區  
 81         ReleaseSemaphore(orange, 1, NULL);  // V操作  
 82     }  
 83     return 0;  
 84     }  
 85   
 86   
 87   
 88     //女兒線程函數  
 89     DWORD WINAPI daughter(LPVOID IpParameter)  
 90     {  
 91         while(1)  
 92         {  
 93             WaitForSingleObject(Apple,INFINITE); //p操作  
 94             cout<<"女兒吃蘋果"<<endl;  
 95             ReleaseSemaphore(EmptyPlate,1,NULL); //v操作  
 96           
 97         }  
 98   
 99         return 0;  
100     }  
101   
102   
103     //兒子線程函數  
104     DWORD WINAPI son(LPVOID IpParameter)  
105     {  
106         while(1)  
107         {  
108             WaitForSingleObject(orange,INFINITE); //p操作  
109             cout<<"兒子吃蘋果"<<endl;  
110             ReleaseSemaphore(EmptyPlate,1,NULL); //v操作  
111   
112         }  
113         return 0;  
114     }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM