司机售票员问题是一个同步问题。
问题背景:
司机开车,售票员售票。
当售票员将门关上的时候司机才可以开车,
当司机将车到站停下的时候,售票员才可以打开车门。
分析:
1.此问题属于同步问题还是互斥问题?
同步问题。司机和售票员共享资源——车门,以及车的状态。通过状态传递才能进行下一步的操作。因此是同步问题。
此问题有两个共享资源,门和车,分别设置为s1和s2 。
2.信号量的初始值如何设定?
首先确定信号量为0或1的时候分别代表什么意义。
售票员和司机都有自己的操作。
售票员:关门,售票,开门
司机:开车,正常行驶,到站停车
对S1(门): 门有两个状态,开和关。售票员将门关上之后,应该讲门的操作权释放给司机(因为只有司机到站了才能停车)。因此0为门开着状态。
对S2(车):两个状态,开车行驶和到站停车。当车开的时候,需要申请车的资源,即用wait,则车在听着的时候状态为1,行驶是状态为0.
因此可得:S1初始状态S1 = 0,S2 = 1;
3.如何确定wait和signal的位置?
首先对司机,司机的操作有:
(1)开车前申请车门资源以判断门是否关好可以开车
(2)到站后停车,释放车的资源
因此司机的状态:
司机
wait(S1)
开车
正常行驶
到站停车
signal(S2)
其次对售票员,售票员的操作有:
(1)关门(可售票),释放门的资源
(2)售票,停车后可以开门,开门之前要申请门的资源以判断是否可以开门
因此售票员的状态:
售票员
关门
signal(S1)
售票
wait(s2)
开门
注:因为起始状态不一样,得到答案有不同结果。但注意起始状态是指司机和售票员的动作是循环的,从循环中不同的结点开始会产生不同的结果。
还请各位童鞋多多指教