信号量实验项目: 桌子上有一个能盛得下5个水果的空盘子,爸爸不停地向盘子中放入苹果或者桔子,儿子不停地从盘子中取出桔子享用,女儿不停的从盘子中取出苹果享用。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿三个进程间的同步。
1.写出相应算法及相关说明。
semaphore mutex = 1,
semaphore empty = 5,//盘子最多可放5个水果
Semaphore apple = 0, orange = 0;//定义苹果、橘子信号量
void father()//父亲进程
{
while (1)
{
buy fruits;
wait(empty);
wait(mutex);
put in a fruit;
signal(mutex);
if (fruit == apple)
signal(apple);
else
signal(orange);
}
}
void son()//儿子进程
{
wait(orange);
wait(mutex);
put out an orange;
signal(mutex);
signal(empty);
eat an orange;
}
void daughter()//女儿进程
{
wait(apple);
wait(mutex);
put out an apple;
signal(mutex);
signal(empty);
eat an apple;
}2.必须用程序设计语言实现整个循环进程的模拟
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <windows.h>
#include <time.h>
sem_t plate;//定义盘子信号量
sem_t apple;//定义苹果信号量
sem_t orange;//定义橘子信号量
sem_t mutex;//定义互斥信号量
void father(void *arg)
{
while(plate)
{
sem_wait(&plate);//信号量-1,P操作
sem_wait(&mutex);//信号量-1,P操作
srand((unsigned) time(NULL));//引入rand函数,随机分配水果
int a= rand()%1000000;
if(a%2==0)
{
sem_post(&apple);//信号量+1,V操作
printf("%d:爸爸放入一个苹果\n",a);
}
else
{
sem_post(&orange);//信号量+1,V操作
printf("%d:爸爸放入一个橘子\n",a);
}
sem_post(&mutex);//信号量+1,V操作
Sleep(3000);
}
}
void son(void *arg)
{
while(orange) // 盘中是否有橘子
{
sem_wait(&orange);//信号量-1,P操作
sem_wait(&mutex);//信号量-1,P操作
sem_post(&plate);//信号量+1,V操作
printf(" 儿子吃了一个橘子\n");
sem_post(&mutex);//信号量+1,V操作
Sleep(8000);
}
}
void daughter(void *arg)
{
while(apple) // 盘中是否有苹果
{
sem_wait(&apple);//信号量-1,P操作
sem_wait(&mutex);//信号量-1,P操作
sem_post(&plate);//信号量+1,V操作
printf(" 女儿吃了一个苹果\n");
sem_post(&mutex);//信号量+1,V操作
Sleep(8000);
}
}
int main()
{
sem_init(&mutex,0,1);//初始化互斥信号量为1
sem_init(&apple,0,0);//初始化苹果信号量为0
sem_init(&orange,0,0);//初始化橘子信号量为0
sem_init(&plate,0,5);//初始化盘子信号量为5,即盘子最大容量
pthread_t x1,x2,x3;//定义三个进程
pthread_create(&x1,NULL,(void*)father,NULL);//建立父亲进程
pthread_create(&x2,NULL,(void*)son,NULL);//建立儿子进程
pthread_create(&x3,NULL,(void*)daughter,NULL);//建立女儿进程
pthread_join(x1,NULL);//等待父亲进程完成
pthread_join(x2,NULL);//等待儿子进程完成
pthread_join(x3,NULL);//等待女儿进程完成
sem_destroy(&mutex);//销毁信号量
sem_destroy(&apple);
sem_destroy(&orange);
sem_destroy(&plate);
return 0;
}
3.运行效果截图。

4.心得体会。
通过不断的学习与修改,最后也是成功的把结果运行出来了,这个程序我设置了四个信号量来模拟分水果和吃水果的过程,但是好像还是无法解决老师所说出现女儿和儿子同时吃不到水果的情况,在实验过程中,我也是遇到了一个问题,就是我写了个只用一个信号量来模拟P、V操作,但是不知道为什么会出现父亲放了水果,然后只有一个人吃的情况,所以就改成了四个信号量的。刚开始的时候,还出现父亲只放一种水果的情况,后来发现是rand函数的值太小所导致的,在程序中我也是将rand函数所产生的值打印出来,只有是为了验证是否放入了正确的水果,将rand值修改后也是成功运行出想要的结果。
版权声明:本文为m0_65202640原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。