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

版权声明:版权归游吟焰火所有,未经允许不得转载。 https://blog.csdn.net/chenzhanqi/article/details/82858406

问题描述:

有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();
}

猜你喜欢

转载自blog.csdn.net/chenzhanqi/article/details/82858406