进程同步问题——卡车装水

问题描述:

有10辆卡车,每车可装20桶水,装满开走,两个工人装水,装满10辆车,使用普通变量和信号量实现进程控制。

问题分析:

1、一辆车装完20桶水后才能进行下一辆车的操作,因此车之间是互斥的。

2、两个工人之间没有互斥关系,可同时装水,但装满后需及时停止装水操作(两个工人不能同时进行对当前已装桶数进行统计),装满后释放当前车辆并对下一车辆进行操作。

伪代码实现:

依据分析结果设置信号量

mutex1卡车信号量每次对一辆车进行操作,初值为1
empty空位信号量每辆车可装水的数量,初值为0,最大20
go放行信号量(装满后)对当前车辆放行,初值为0
mutex2判断信号量对已装的数量进行判断,初值为1

卡车类

void car(){
    while(mutex1){
        car in;               //车进入
        for(i=1;i<=20;i++)
            signal(empty);    //对每辆车的empty置20
        wait(go);             //未装满水则不能释放
        car go;               //车走
        signal(mutex1);
    }
}
            

工人类(每个工人的操作都一样,只是同时只能由一个工人对in进行判断并释放go信号量)

void worker(){
    while(1){
        wait(empty);        //该工人进行一次装水操作,empty就-1
        in++;               //装水
        wait(mutex2);      //对已装水的数量进行判断,同时只能有一个工人进行判断
        if(in>=20){
            in=0;           //若当前车辆已装满,in置0
            signal(go);     //car类中的go信号量被释放,可执行车走的操作
            signal(mutex2); 
        }
}

主类

int main(){
    for(i=0;i<10;i++)
        car();            //实例化10辆车
    worker1();
    worker2();
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值