#include <stdio.h>
#include <stdlib.h>
typedef struct semaphore {
int random;//存储随机数,用于选择提供资源的类型
int offer1;//对应烟草和纸的组合
int offer2;//对应烟草和胶水的组合
int offer3;//对应胶水和纸的组合
int finish;//对应进程执行完毕后的应答
}semaphore;
typedef struct Smoker {
int num;
int sign;
}Smoker;
//申请资源
int wait(semaphore *s,Smoker *sm){
switch (sm->num) {
case 1:
if (s->offer1 == 1) {
//表示1号进程得到想要的资源
sm->sign = 1;//表示1号进程申请到资源
printf("%d号进程申请到需要的资源...\n", sm->num );
break;
}
else {
printf("%d号进程没有申请到需要的资源...\n", sm->num );
break;
}
case 2:
if (s->offer2 == 1) {
//表示1号进程得到想要的资源
sm->sign = 1;//表示1号进程申请到资源
printf("%d号进程申请到需要的资源...\n", sm->num );
break;
}
else {
printf("%d号进程没有申请到需要的资源...\n",sm->num );
break;
}
case 3:
if (s->offer3 == 1) {
//表示1号进程得到想要的资源
sm->sign = 1;//表示1号进程申请到资源
printf("%d号进程申请到需要的资源...\n", sm->num );
break;
}
else {
printf("%d号进程没有申请到需要的资源...\n",sm->num );
break;
}
}
return 0;
}
//释放资源
int signal(semaphore *s,Smoker *sm) {
switch (sm->num) {
case 1:
if (sm->sign == 1) {
printf("%d号吸烟者得到资源开始吸烟...\n",sm->num );
s->finish = 1;
s->offer1 = 0;
sm->sign = 0;
printf("%d号吸烟者抽烟完成,并将烟草和纸用完\n",sm->num );
break;
}
else {
printf("%d号吸烟者没有得到资源,不能吸烟...\n",sm->num );
break;
}
case 2:
if (sm->sign == 1) {
printf("%d号吸烟者得到资源开始吸烟...\n",sm->num );
s->finish = 1;
s->offer2 = 0;
sm->sign = 0;
printf("%d号吸烟者抽烟完成,并将烟草和胶水用完\n",sm->num );
break;
}
else {
printf("%d号吸烟者没有得到资源,不能吸烟...\n",sm->num );
break;
}
case 3:
if (sm->sign == 1) {
printf("%d号吸烟者得到资源开始吸烟...\n",sm->num );
s->finish = 1;
s->offer3 = 0;
sm->sign = 0;
printf("%d号吸烟者抽烟完成,并将胶水和纸用完\n",sm->num );
break;
}
else {
printf("%d号吸烟者没有得到资源,不能吸烟...\n",sm->num );
break;
}
}
return 0;
}
int provide(semaphore *s){
int a = rand() % 3 + 1;
printf("%d\n",a);
if (s->finish == 1) {
switch (a) {
case 1:
s->offer1 = 1;
break;
case 2:
s->offer2 = 1;
break;
case 3:
s->offer3 = 1;
break;
}
} else {
printf("进程没有使用完资源,还不能派发新的资源...\n");
}
return 0;
}
int main()
{
semaphore s;
s.finish = 1;
s.offer1 = 0;
s.offer2 = 0;
s.offer3 = 0;
Smoker s1,s2,s3;
s1.num=1,s2.num=2,s3.num=3;
s1.sign=0,s2.sign=0,s3.sign=0;
//随机生成10个材料供他人选择
for(int i=0;i<10;++i){
provide(&s);
wait(&s,&s1);
wait(&s,&s2);
wait(&s,&s3);
//printf("抽烟者%2d%2d%2d\n",s1.sign,s2.sign,s3.sign);
signal(&s,&s1);
signal(&s,&s2);
signal(&s,&s3);
//printf("%2d%2d%2d%2d",s.finish,s.offer1,s.offer2,s.offer3);
}
return 0;
}