操作系统进程同步之吸烟者问题,C语言实现

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值