0

我正在为一位哲学家创建一个线程。这是伪代码:

while(true)
  think
  get left chopstick
  get right chopstick
  eat
  putdown left chopstick
  putdown right chopstick

直觉,我认为松开筷子的顺序并不重要。所以先放下左筷子,我能先放下右筷子吗?这会导致任何错误吗?我怀疑它会。如果这导致死锁,怎么办?如果不是,但建议先离开,那为什么?

谢谢!

4

3 回答 3

0

您在这里有几个锁:

while(true)
  think

  wait until you finished thinking

  get left chopstick
  get right chopstick

  wait until you you took both sticks

  eat
  putdown left chopstick
  putdown right chopstick

锁(等待)之间的事情可以以任何顺序成功,因为它无关紧要。

于 2014-04-30T16:40:18.423 回答
0

从视觉上想象它。假设你有四个哲学家,每个人中间都有一根筷子。

四人同时抓起左筷子。这没关系,因为每个人都有一根筷子,没有人争抢一根。

然后他们向右看,筷子已经没有了,因为每个人都有四根中的一根。

他们不能吃东西,所以他们陷入僵局。

如果你这样编码,一段时间后他们放弃并放下筷子,你会遇到同样的问题,因为每个人都试图拿起左边的筷子而没有剩下的右手筷子(时间可能导致这种情况不会发生,但是最好为它编写代码)。

相反,你应该选择一个哲学家,让他先拿起他的右手筷子。这打破了僵局,因为无论是右边的筷子哲学家还是他左边的哲学家都会成功地拿到筷子并能够吃东西(最终会绕着圈子喂饱所有人)。

于 2014-04-30T16:43:09.623 回答
0
while(true)
  think

  identify nearest chopstick set location

  think

  get nearest chopstick of set
  get remaining chopstick of set

  eat

  putdown left chopstick
  putdown right chopstick
于 2014-04-30T16:50:49.573 回答