多线程练习----吃水果问题

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

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



#include <Windows.h> #include <iostream> using namespace std; DWORD WINAPI Father( LPVOID lpParameter); DWORD WINAPI Monther( LPVOID lpParameter); DWORD WINAPI Son( LPVOID lpParameter); DWORD WINAPI Daughter( LPVOID lpParameter); HANDLE Empty; HANDLE Full; int data = 0; int main() { HANDLE hFather = CreateThread(NULL, 0, Father, NULL, 0, NULL) ; HANDLE hMonther = CreateThread(NULL, 0, Monther, NULL, 0, NULL) ; HANDLE hSon = CreateThread(NULL, 0, Son, NULL, 0, NULL) ; HANDLE hDauther = CreateThread(NULL, 0, Daughter, NULL, 0, NULL); Empty = CreateEvent(NULL, FALSE, TRUE, NULL); Full = CreateEvent(NULL, FALSE, FALSE, NULL); Sleep(400); CloseHandle(hDauther); CloseHandle(hFather); CloseHandle(hMonther); CloseHandle(hSon); return 0; } DWORD WINAPI Father( LPVOID lpParameter) { while(1) { int i = 2 ; while( i % 2 == 0) { i = rand() % 999 + 1; } //父亲产生单数 data = i; SetEvent(Full); } return 0; } DWORD WINAPI Monther( LPVOID lpParameter) { while(1) { WaitForSingleObject(Empty, INFINITE); int i = 1 ; while( i % 2 != 0) { i = rand() % 999 + 1; } //妈妈产生双数 data = i; SetEvent(Full); Sleep(1); } return 0; } DWORD WINAPI Son( LPVOID lpParameter) { while(1) { WaitForSingleObject(Full, INFINITE); if ( data % 2 == 0) { //儿子输出双数 cout << "Son :" << data << endl; } SetEvent(Empty); } return 0; } DWORD WINAPI Daughter( LPVOID lpParameter) { while(1) { WaitForSingleObject(Full, INFINITE); if ( data % 2 == 1) { //女儿输出单数 cout << "Daughrer :" << data << endl; } SetEvent(Empty); } return 0; }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值