结合实际问题理解PV操作和信号量机制

来源:互联网 发布:手机连接网络摄像机 编辑:程序博客网 时间:2024/06/05 11:14

5.在公共汽车上,司机和售票员的工作流程图如下图所示。为保证乘客安全。

司机和售票员应密切配合协调工作。请用信号量来实现司机和售票员之间的同步。



设置两个信号量:S1、S2,S1表示是否允许司机启动汽车,其初值为0;S2表示是否允许售票员开门,其初值为0。问题描述如下:

Semaphoere S1=S2=0;

Void Driver( ){

    While(1)

     {

       P(S1);

       启动车辆;

       正常行车;

       到站停车;

       V(S2)

}

Void Busman( ){

      While(1){

           关车门;

           V(S1);

           售票;

           P(S2);

           开车门;

}

}

      Main()

       Cobegin{

         Driver( );

         Busman( );

}




对于上述题目,该如何理解???


首先,提出一个疑问:

1.为什么把S1,S2的初值置为1???

2.司机的动作,受限于售票员关门之后,说明售票员掌握着V(S)操作,而司机掌握着P(S)操作。

3.同时,售票员开门的操作,受限于司机到站停车之后,说明,司机掌握着V(S)的操作,而售票员掌握着P(S)的操作

“问题:要想使司机“启动车辆”动作的执行,只有在售票员执行关门操作之后,才能执行即:“启动车辆”之前司机要询问(测试)售票员“门关上没有?”,当售票员‘关上门’回答是之后,司机听到是,才启动车辆。即:启动车辆之前要有一个P(S)操作,即:先测试”

而售票员在关上门之后,执行V(S)操作,即开锁

同样,对于售票员,只有司机停车,他才能开门。

所以在售票员售票之前一定要测试:是否“到站停车”即: P(S)

而司机到站之后,才允许开门,即司机在到站之后,执行开锁即: V(S)



通过以上分析,我们可以看出:

就是用信号量来控制动作的执行。

那么,一开始为什么设置S1=S2=0呢???

因为:

如果S1=S2=1的初值为1的话,P(S1)和P(S2)毫无意义,因为,锁一开始是开着的,所以双方都会执行。无法受到对方的约束。

而当初始值 S1=S2=0时,即在开始时,S1和S2是锁着的,只有对方开开之后,才能进入,可以实现双方的动作的先后关系。


0 0
原创粉丝点击