2、有桥如图所示,车流如箭头所示,桥上不允许两车交汇,但允许同方向多辆车依次通过(即桥上可以有多个同方向的车)。用P、V操作实现交通管理以防止桥上堵塞。
//首先定义semaphore类型的信号量
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++;//是的话,把计数器加1
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);
}
}