一些PV操作的题目
王道P107 15
设自行车生产线上有一个箱子,其中有N个位置(N≥3),每个位置可存放一个车架或者一个车轮,设有3名工人,其活动分别为:
工人1活动:
do{
加工一个车架;
车架放入箱中;
}while(1)
工人2活动:
do{
加工一个车轮;
车轮放入箱中;
}while(1)
工人3活动:
do{
箱中取一个车架;
箱中取两个车轮;
组装为一辆车;
}while(1)
试分别用信号量PV操作实现三名工人的合作,要求解中不含死锁。
分析:
先不考虑死锁问题,工人1、2分别与3是生产者和消费者关系。箱子内的空位是工人1、2的资源,车架和车轮是工人3的资源。
再来看死锁问题:如果说工人1或者工人2某一方生产速度很快,N个空位全部为车轮,或者≥N-1个空位是车架的话(此时最多只能放入一个车轮),工人3永远得不到组装一个完整的车的资源,就会发生死锁。所以车架最多不能达到N-2个,也就是车架的信号量初值要设置为N-2,车轮要设置为N-1。
故整个活动的伪代码如下:
semaphore empty=N;//箱子内的空位
semaphore weel=0;//车轮
semaphore frame=0;//车架
semaphore s1=N-2;//车架最大值
semaphore s2=N-1;//车轮最大值
工人1活动:
do{
加工一个车架;
P(empty);//检测是否还有空位置
P(s1);//检测车架是否还有空位
车架放入箱中;
V(frame);//车架数量+1
}while(1)
工人2活动:
do{
加工一个车轮;
P(empty);//检测是否还有空位
P(s2);//检测车轮是否还有空位
车轮放入箱中;
V(wheel);//车轮数+1
}while(1)
工人3活动:
do{
P(frame);//检测是否有车架
箱中取一个车架;
V(empty);//空位+1;
V(s1);//车架空位+1;
P(wheel);
P(wheel);
箱中取两个车轮;
V(empty);
V(empty);
V(s2);
V(s2);
组装为一辆车;
}while(1)