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;
}