有桥如下图所示,车流如箭头所示,桥上不允许两车交汇,但允许同方向多辆车依次通过(即桥上可以有多个同方向的车)。用P、V操作实现交通管理以防止桥上堵塞【北京大学 1992】
解析:这个题目要解决:南、北互斥(桥上不允许两车交汇,相当于“读、写互斥”),需要设置一个互斥信号量mutex,初值为1;南、南共享(相当于“读、读共享”),套用实现“读、读共享”的模式,需要设置一个共享变量southcount,用于记录当前桥上向南行驶过桥的车辆数目,初值为0,再设置一个互斥信号量smutex,实现对southcount的互斥访问;北、北共享(也相当于“读、读共享”),套用实现“读、读共享”的模式,同理可得。
semaphore mutex = 1;// 作为桥的互斥访问信号量
semaphore smutex = 1;// 作为southcount的互斥访问信号量
semaphore nmutex = 1;// 作为northcount的互斥访问信号量
int southcount = 0;// 记录南方向的车辆的数量
int northcount = 0;// 记录北方向的车辆的数量
void south()
{
while(true)
{
wait(smutex);
if(southcount == 0)
wait(mutex);
southcount++;
signal(smutex);
// 南方车辆通过
wait(smutex);
southcount--;
if(southcount == 0)
signal(mutex);
signal(smutex);
}
}
void north()
{
while(true)
{
wait(nmutex);
if(northcount == 0)
wait(mutex);
northcount++;
signal(nmutex);
// 北方车辆通过
wait(nmutex);
northcount--;
if(northcount == 0)
signal(mutex);
signal(nmutex);
}
}