2.5 CPU管理--进程同步经典问题-司机和售票员问题

上一小节讲了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) 才执行

        开车门

    }

}

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南野栀子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值