问题描述:
有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();
}