单向公路桥与信号量

时间:2014-02-17 18:20:45

标签: multithreading concurrency semaphore

我正在尝试仅使用信号量/互斥量来实现单向桥,单向桥有三个规则:

  1. 一次只能从一个方向开车。
  2. 只要没有汽车进入另一端,就可以有多辆汽车朝同一方向行驶。
  3. 如果相反方向的汽车在桥上有汽车时到达,则对面的汽车会等到桥被清除。
  4. 如果有更多的汽车到达桥梁,而同一方向的汽车已经在桥上,但已经有车辆在另一端等待,新到达的汽车也应该等到桥梁清理,所有相反的终点车也经过。它遵循先到先得的规则。
  5. 这是规则4的图表

    (字母代表汽车,破折号代表桥梁)

    B is alreaydy on the road:
        -----B-------
    A arrives, waits for B:
        A---B--------
        A--B---------
    now C arrives, same direction as B, and waits for B and A since A arrived first.
        A-B---------C
        AB----------C
    B exits, A takes over
        -A----------C
        ...
        -----------AC
    Finally A exits and C takes over
        -----------C-
    

    现在我有一个互斥锁,当它上面有车时会锁定桥,但是我不能让规则4发生。任何更明智的想法将不胜感激!

1 个答案:

答案 0 :(得分:0)

当汽车接近桥梁时,它会获得递增令牌。当两辆车在对面等待桥梁自由时,具有较小令牌的车辆优先。这应解决你的#4。

// initial conditions
bridge.calling = 1
bridge.next_ticket = 0

// car approaching the bridge
bridge.mutex.lock();
myself.ticket = ++ bridge.next_ticket
while (bridge.calling != myself.ticket)
    bridge.condition.wait(bridge.lock)
bridge.mutex.unlock()
// drive through the bridge
bridge.mutex.lock()
++ bridge.calling
bridge.mutex.unlock()
bridge.condition.notify_all()