上一小节讲了PV信号量的概念,还有进程同步、异步的概念,现在我们用实际的问题来使用PV信号量。
1. 问题分析图
如下图,公共汽车上,司机和售票员各司其职。司机需要等售票员关好门之后才能启动车,售票员只有等司机停好车后才能开车门,两者必须配合默契,协调一致。
2. 变量设计
设置信号量 Start 来控制是否可以让司机启动汽车,初值为 0;
设置信号量 Open 控制是否可以让售票员开启车门,初值为 0;
这表示当前状态是汽车未启动且车门已经打开,不允许司机启动汽车,也不允许售票员开车门。
3. 代码设计
3.1 相关代码如下:
Seamphore Start,Open;
Start.value=0,Open.value=0
Cobegin
Process 司机()
{
While(1)
{
P(Start)
启动汽车
正常行驶
到站停车
V(Open)
}
}
Process 售票员()
{
While(1)
{
关闭车门
V(Start)
售票
P(Open)
开车门
}
}
3.2 代码解释
3.2.1 对于司机进程
Process 司机()// 创建司机进程
{
While(1) // 进程持续
{
P(Start) // 先执行 P,才能启动汽车,因为初始状态 Start 为 0
启动汽车
正常行驶
到站停车
V(Open) // 到站后,执行 V( open),允许打开车门
}
}
3.2.2 对于售票员进程
Process 售票员()
{
While(1)
{
关闭车门 // 初始状态车门是开的,所以必须先关车门
V(Start) // 先执行 V,司机进程才能启动汽车
售票
P(Open) // 在司机执行了 V(Open) 之后, P(open) 才执行
开车门
}
}