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