【发布时间】:2012-02-22 22:51:12
【问题描述】:
这是一个面试问题,被问到并希望找到一个有效的解决方案。
问题
考虑如图所示的四条道路的交叉点。每条道路都被定义为有一个方向。您将如何解决问题以改善交通状况并避免死锁。
- 交叉口分为四个象限[以黄色显示]。
- 汽车从四个方向[0,1,2,3]随机进入路口
- 在十字路口,每辆车都可以单步移动。三个可能的动作是
- 向左走
- 直走
- 向右走
例如:
如果汽车从方向 2 进入并想左转。它应该通过 quandrant 2,quandrant 1,最后是 quandrant 0
半完整解决方案
用黄色标记的每个象限都有一个与之关联的信号量。 我想象的是一个两阶段协议,其中每辆车都会
- 获取它将通过的象限列表
- 从最后一个象限开始锁定每个象限
- 在上面的示例中,来自方向 2 的汽车将锁定 象限 0、象限 1,然后锁定 象限 2 >.
- 穿过十字路口
- 释放获取的锁。
- 锁以相同的顺序释放。 象限 0、象限 1 和 象限 2
但是,上述解决方案并不是最优的,因为它会导致死锁。
我的问题是
- 还有什么其他/更好的方法可以实现?
- 我可以使用 C 中的信号量来实现吗?
- 如果不是,我应该使用哪种同步方法?
更新
- 我想要一个解决方案,它允许多辆汽车进入交叉路口,并且仍然避免死锁和碰撞。在整个交叉路口设置一个锁会不够优化。
【问题讨论】:
-
如果生成每个汽车运动的进程是独立的,则需要信号量。如果您在单个程序中模拟整个事情,则不需要信号量,只需标志就足够了。
标签: multithreading algorithm synchronization deadlock semaphore