The Little Book of Semaphores 信号量小书 第五章 稍欠经典的同步问题 5.8 过山车问题

第五章 稍欠经典的同步问题

 

5.8 过山车问题

这个问题来自安德鲁斯的并发编程[1],但他把它归功于J. S. Herman的硕士论文。


假设有n个乘客线程和一个汽车线程。乘客们反复等待乘坐汽车,汽车可以容纳C名乘客,其中C<n。汽车只有在满载时才能绕轨道行驶。


以下是一些附加细节:
•乘客应该调用board和unboard。
•汽车应调用load,run和unload。
•在汽车调用load之前,乘客不能调用board
•在C个乘客上车后,汽车才能出发。
•在汽车调用unload之前,乘客不能调用unboard。

思考:为执行这些限制的乘客和汽车编写代码。

 

5.8.1 过山车提示

互斥锁可以保护passengers,它可以计算调用boardCar的乘客数量。

乘客在上车前等待boardQueue,在下车前等待unboardQueue。 allAboard表示车已满。

 

5.8.2 过山车方案

这是我的汽车线程代码:

当汽车到达时,它向C个乘客发出信号,等待最后一个乘客上车后向allAboard发出信号。在它出发后,它允许C个乘客下车,然后等待allAshore。

乘客在上车前等待汽车,自然地,在下车前等待汽车停下来。 最后一位上车的乘客向汽车发出信号并重置乘客计数器。

 

5.8.3 多辆过山车问题

这个解决方案并不能推广到有一辆车以上的情况。

为了做到这一点,我们必须满足一些额外的约束:

•一次只能登上一辆车。
•多辆车可以同时在轨道上行驶。
•由于汽车间不能相互通过,因此必须按照他们登上的顺序卸载【先载客的车也要先下客】。
•前一个汽车装载的所有线程必须在随后的车辆的任何线程之前下车。


思考:修改前一个解决方案以处理额外的约束。 可以假设有m辆汽车,并且每辆汽车都有一个名为i的局部变量,该变量包含介于0和m_1之间的标识符。

 

5.8.4 多辆过山车问题提示

我使用了两个信号量列表来保持汽车秩序。 一个代表装载区域,一个代表卸载区域。 每个列表包含每辆车的一个信号量。 在任何时候,每个列表中只有一个信号量被解锁,从而强制装载和卸载的线程的顺序。 最初,只有汽车0的信号量被解锁。 当每辆车进入装载(或卸载)时,它会等待自己的信号量;当它离开时,它会向下一辆车发出信号。

 

next函数按顺序计算下一辆汽车的标识符(从0到m - 1):

 

5.8.5 多辆过山车问题方案

下面是修改后的汽车的代码:

乘客的代码没有变。

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值