城市道路十字路口的通行规则是“红灯停,绿灯行”,请用信号量和PV操作描述交通信号灯和汽车通过十字路口的同步行为
1)识别那些可以作为进程
信号灯,汽车
2)其次识临界资源,即进程共享的事务
信号灯,汽车
3)定义数据结构
定义共变和私有变量:
Int inter=10;//信号灯延长时间
Int number=0;//等待车辆数目
4)定义进程操作
4.1交通信号灯控制进程操作:
交通信号灯延时10秒
交通灯颜色切换为绿色
唤醒所有等待红灯信号的车辆使其同行
重置延时时间为10秒
绿灯信号延时十秒
绿灯颜色切换为红色
重置延时时间为10秒
4.2汽车进程操作
绿灯则通行
否则就使等红灯的车辆数目加一
执行等待动作
红灯变为绿色,结束等待,行车
5)操作进程伪代码实现
交通和信号灯控制进程伪代码实现
int Red = 0;
int Green = 1;
semaphore mutex = 1, wait = 0;
mutex,number//互斥访问信号量,车辆等待信号量
inter=10,number=0,Light=Red;//信号灯延长时间、车辆等待数目、信号灯颜色
begin
/*信号灯进程操作实现*/
Process lightControl()
{
While(inter)//使信号灯延时10秒
{
Inter--;
}
Light=Green;//信号灯切换为绿色
P(mutex);
While(number--)V(wait);//唤醒所有等待红灯信号的车辆使其同行
V(mutex);
Inter=10;//重新设置延时时间
While(inter)//使绿灯延时10秒
{
Inter--;
}
Light=Red;//信号灯切换为红色
Inter=10;//重置延时时间
}
/*汽车进程操作实现1*/
Process Car-i()//i=1,2,3…….
{
P(mutex);
If(Light==Green)
{
通行;
V(mutex);
}
else
{
number++;//使等待红灯的车辆数目增加1
V(mutex);
P(wait);//执行等待动作
通行;//信号灯变为绿色,等待结束,行车
}
}
Coend
/*汽车进程操作实现2完善版*/
Process Car-i()//i=1,2,3…….
{
While(1)
{
P(mutex);
If(Light==Green)
{
通行;
V(mutex);
break;
}
else
{
number++;//使等待红灯的车辆数目加1
V(mutex);
P(wait);//执行等待动作
}
}
}