新手敲的,大佬们还是别看了
信号量实验项目: 桌子上有一个能盛得下5个水果的空盘子,爸爸不停地向盘子中放入苹果或者桔子,儿子不停地从盘子中取出桔子享用,女儿不停的从盘子中取出苹果享用。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿三个进程间的同步。
要求:
1、写出相应算法及相关说明。
2、必须用程序设计语言实现整个循环进程的模拟。(设计语言不限)
3、对模拟效果进行截图,提交完整的实验报告。
4、在学习通中上传Word 版实验报告附件。
实验代码:
#include<stdio.h>
#include<stdlib.h>
int S = 1;
int applenum = 0;
int orangenum = 0;
int fruitnum = 0;
int main()
{
ddd();
}
void ddd()
{
int i = 0;
while (i<105)
{
i++;
int np = rand()%4;
if(np == 0 || np ==3)
{
father();
}
if(np == 1)
{
son();
}
if(np == 2)
{
daughter();
}
}
}
//盘子的互斥量
void mutex()
{
if(S == 1)
{
S = S-1;
}
else
{
ddd();
}
}
//水果的互斥量
void fruit()
{
if(fruitnum < 5)
{
fruitnum = fruitnum + 1;
}
else
{
ddd();
}
}
void fruitapp()
{
if(applenum>0)
{
applenum = applenum - 1;
fruitnum = fruitnum - 1;
}
else
{
ddd();
}
}
void fruitora()
{
if(orangenum>0)
{
orangenum = orangenum - 1;
fruitnum = fruitnum - 1;
}
else
{
ddd();
}
}
//释放盘子的互斥量
void rollmutex()
{
S = S+1;
}
void rollapp()
{
applenum = applenum + 1;
}
void rollora()
{
orangenum = orangenum +1;
}
void father()
{
fruit();
mutex();
int num = rand() % 100 + 1;
if (num % 2 == 0)
{
//放入一个苹果
printf("\n父亲放入一个苹果到盘子中\n");
rollapp();
printf("盘子中水果的数量为%d,其中苹果数量为%d,桔子数量为%d\n",fruitnum,applenum,orangenum);
}
else
{
//放入一个桔子
printf("\n父亲放入一个桔子到盘子中\n");
rollora();
printf("盘子中水果的数量为%d,其中苹果数量为%d,桔子数量为%d\n",fruitnum,applenum,orangenum);
}
rollmutex();
}
void son()
{
fruitapp();//先申请水果的互斥量,不可与mutex互换
mutex();
//取出一个苹果
printf("\n儿子将苹果从盘子中取出来享用\n");
printf("盘子中水果的数量为%d,其中苹果数量为%d,桔子数量为%d\n",fruitnum,applenum,orangenum);
rollmutex();
}
void daughter()
{
fruitora();
mutex();
//取出一个桔子
printf("\n女儿将桔子从盘子中取出来享用\n");
printf("盘子中水果的数量为%d,其中苹果数量为%d,桔子数量为%d\n",fruitnum,applenum,orangenum);
rollmutex();
}
实验效果图: