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 多辆过山车问题方案
下面是修改后的汽车的代码:
乘客的代码没有变。