原文地址: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 }