父亲儿子女儿三人水果分配

问题:桌子上有一个空盘子,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放橘子。儿子专等吃苹果,女儿专等吃橘子。规定盘中空时,一次只能放一个水果供吃者取用。

要求:使用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");
      }
}


调试发现,次数太少,容易误认为执行错误。因为所有输出结果都可能一样。思考一下,可能是伪随机数生成的问题。
在这里插入图片描述
为了使儿女更加公平,用奇偶数判别,修改代码如下:
在这里插入图片描述
在这里插入图片描述
新的运行结果相对公平许多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值