问题:桌子上有一个空盘子,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放橘子。儿子专等吃苹果,女儿专等吃橘子。规定盘中空时,一次只能放一个水果供吃者取用。
要求:使用P、V原语实现爸爸、儿子、女儿,三个并发进程的同步。
实验环境:VS2010
PS:小白操作
以上原理一目了然。C语言实现源码:
#include "stdafx.h"
#include "stdlib.h"
#include "time.h"
#include "windows.h"
int plate = 0; //判断盘子是否为空? 初始为0,表示是空的
int SO = 0; //判断盘子里水果是橘子吗? 初始为0,表示不是
int SA = 0; //判断盘子里水果是苹果吗? 初始为0,表示不是
bool S = false; //判断盘子内是否有东西? 初始为false,表示没有东西,可以放
//爸爸的线程
void CreateProcessFather()
{
while(plate<1)
{
plate++; //盘子里水果个数小于1,+1
S=true; //盘子里放东西了,置true
srand((unsigned)time(NULL));
int a= rand()%100+1;
if(a>50)
{
pintf("father puts a apple!\n"); //父亲放苹果
SA++;
}
else
{
printf("father puts a orange!\n"); //父亲放橘子
SO++;
}
}
}
//儿子线程
void CreateProcessSon()
{
if(S) //判断盘子里有没有水果,bool变量S
{
while(SA>0) //判断苹果数量,>1,开始吃
{
Sleep(3000); //吃苹果时间长
printf("son eat a apple!\n");
plate--;
SA--;
S=false; //吃完回置数据
}
}
}
//女儿线程
void CreateProcessDaughter()
{
if(S)
{
while(SO>0)
{
Sleep(1000);
printf("daughter eat a orange!\n");
plate--;
SO--;
S=false;
}
}
}
void main()
{
int i,n;
printf("一共让孩子们吃几次水果?\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
CreateProcessFather();
CreateProcessSon();
CreateProcessDaughter();
printf("\n");
}
}
调试发现,次数太少,容易误认为执行错误。因为所有输出结果都可能一样。思考一下,可能是伪随机数生成的问题。
为了使儿女更加公平,用奇偶数判别,修改代码如下:
新的运行结果相对公平许多。