问题
独木桥问题1:东西向汽车过独木桥,为了保证安全,只要桥上无车,车过桥,待一方的汽车全部过完后,另一方的汽车才允许过桥。请用信号量和PV操作来写出汽车过独木桥问题的同步算法。
思路
首先对于东西两侧的车辆而言,桥是一个互斥资源,而对东西两侧各自而言,每辆车上桥是同步关系,东西两侧的车辆在抢到这互斥资源后只有最后一辆车通过了独木桥才释放。
semaphore wait,mutex1,mutex2;
mutex1=1;//东侧车辆的互斥信号量
mutex2=1;//西侧车辆的互斥信号量
wait=1;//互斥信号量,表示独木桥的数量
int count1,count2;
count1=0;//东侧车辆数
count2=0;//西侧车辆数
cobegin
process P 东(){
P(mutex1);//封锁,防止多个进程同时改变count的值,导致修改被覆盖
count1++;
if(count1==1)//第一辆车上桥
P(wait);
V(mutex1);
/*过独木桥*/
P(mutex1);//与上面count++同理
count1--;
if(count1==0)//东侧车辆全部下桥
V(wait);
V(mutex1);
}
process P 西(){
P(mutex2);
count2++;
if(count2==1)//第一辆车上桥
P(wait);
V(mutex2);
/*过独木桥*/
P(mutex2);
count2--;
if(count2==0)//西侧车辆全部下桥
V(wait);
V(mutex2);
}
coend