【转】用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