多线程_吃水果问题

来源:互联网 发布:网络传销量刑标准最新 编辑:程序博客网 时间:2024/04/20 01:18

n问题描述:桌上有一只盘子,每次只能放一个水果,爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子空,则爸爸或妈妈可向盘中放水果,仅当盘中有自己需要的水果时,儿子或女儿可从中取出,请给出四人之间的同步关系,并用PV操作实现四人正确活动的程序。 

解:四人之间的关系:1爸爸,妈妈要互斥使用盘子,所以两者之间是互斥关系;2爸爸放的苹果,女儿吃,所以两者是同步关系;3妈妈放的桔子,儿子吃,所以两者也是同步关系。


  1. #include <Windows.h>  
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5. DWORD WINAPI Father( LPVOID lpParameter);  
  6. DWORD WINAPI Monther( LPVOID lpParameter);  
  7. DWORD WINAPI Son( LPVOID lpParameter);  
  8. DWORD WINAPI Daughter( LPVOID lpParameter);  
  9.   
  10. HANDLE Empty;  
  11. HANDLE Full;  
  12. int data = 0;  
  13. int main()  
  14. {  
  15.     HANDLE hFather = CreateThread(NULL, 0, Father, NULL, 0, NULL)   ;  
  16.     HANDLE hMonther = CreateThread(NULL, 0, Monther, NULL, 0, NULL) ;  
  17.     HANDLE hSon = CreateThread(NULL, 0, Son, NULL, 0, NULL) ;  
  18.     HANDLE hDauther = CreateThread(NULL, 0, Daughter, NULL, 0, NULL);     
  19.   
  20.   
  21.     Empty = CreateEvent(NULL, FALSE, TRUE, NULL);  
  22.     Full = CreateEvent(NULL, FALSE, FALSE, NULL);  
  23.   
  24.     Sleep(400);  
  25.     CloseHandle(hDauther);  
  26.     CloseHandle(hFather);  
  27.     CloseHandle(hMonther);  
  28.     CloseHandle(hSon);  
  29.     return 0;  
  30. }  
  31.   
  32. DWORD WINAPI Father( LPVOID lpParameter)  
  33. {  
  34.     while(1)  
  35.     {  
  36.             int i = 2 ;  
  37.             while( i % 2 == 0)  
  38.             {  
  39.                 i = rand() % 999 + 1;  
  40.             }  
  41.             //父亲产生单数  
  42.             data = i;  
  43.             SetEvent(Full);  
  44.     }  
  45.     return 0;  
  46. }  
  47. DWORD WINAPI Monther( LPVOID lpParameter)  
  48. {  
  49.     while(1)  
  50.     {  
  51.         WaitForSingleObject(Empty, INFINITE);  
  52.             int i = 1 ;  
  53.             while( i % 2 != 0)  
  54.             {  
  55.                 i = rand() % 999 + 1;  
  56.             }  
  57.             //妈妈产生双数  
  58.             data = i;  
  59.             SetEvent(Full);  
  60.             Sleep(1);  
  61.     }     
  62.   
  63.     return 0;  
  64. }  
  65. DWORD WINAPI Son( LPVOID lpParameter)  
  66. {  
  67.   
  68.     while(1)  
  69.     {  
  70.         WaitForSingleObject(Full, INFINITE);  
  71.         if ( data % 2 == 0)  
  72.         {  
  73.             //儿子输出双数  
  74.             cout << "Son  :" << data << endl;  
  75.         }  
  76.         SetEvent(Empty);  
  77.     }  
  78.     return 0;  
  79. }  
  80. DWORD WINAPI Daughter( LPVOID lpParameter)  
  81. {  
  82.     while(1)  
  83.     {  
  84.         WaitForSingleObject(Full, INFINITE);  
  85.         if ( data % 2 == 1)  
  86.         {  
  87.             //女儿输出单数  
  88.             cout << "Daughrer :" << data << endl;  
  89.         }  
  90.         SetEvent(Empty);  
  91.     }  
  92.     return 0;  
  93. }