当前位置: 首页 > 知识库问答 >
问题:

给哲学家的线。放下筷子的顺序

鲁淇
2023-03-14

我在为一个哲学家创建一个线程。下面是伪代码

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

凭直觉,我认为松开筷子的顺序无关紧要。那么,如果先放下左筷子,我可以先放下右筷子吗?这会导致任何错误吗?我怀疑它会。如果这导致死锁,如何解决?如果不是,但建议先左,为什么?

非常感谢。

共有3个答案

苍元章
2023-03-14
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
容磊
2023-03-14

想象一下。假设你有四位哲学家,每一位哲学家之间都有一根筷子。

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

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

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

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

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

公孙英飙
2023-03-14

这里有几个锁:

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

锁之间的事情(等待)可以以任何顺序成功,因为这并不重要。

 类似资料:
  • 生产者/消费者和读者/作家很容易想到,但是餐饮哲学家呢?在什么样的情况下,N个进程和N个资源会躺在环形拓扑上并相互交错?我可以想到N个进程竞争M个资源,但是在这种情况下,每个进程可以使用任何两个资源。 维基说Dijkstra用它来模拟竞争磁带驱动器外围设备的计算机。这种情况在现代还存在吗?

  • 本文向大家介绍餐饮哲学家问题(DPP),包括了餐饮哲学家问题(DPP)的使用技巧和注意事项,需要的朋友参考一下 餐饮哲学家的问题指出,有5位哲学家共享一张圆桌,他们交替吃饭和思考。每个哲学家都有一碗饭和5根筷子。哲学家需要左右筷子才能吃饭。饿了的哲学家只有在两把筷子都齐备的情况下才可以吃东西,否则哲学家放下筷子,重新开始思考。 餐饮哲学家是一个经典的同步问题,因为它演示了一大类并发控制问题。 餐饮

  • 今天,我决定尝试解决哲学家吃饭的问题。所以我写下面的代码。但我认为这是不正确的,所以如果有人告诉我这是怎么回事,我会很高兴的。我使用fork作为锁(我只读取它们,因为我不把对它们的访问放在同步块中),我有一个扩展线程的类,它保留了它的两个锁。 我认为有些不对劲,因为第五位哲学家从不吃饭,第四位和第三位哲学家大多吃饭。提前感谢。

  • 定律1:我们知道,在任何一张左撇子和右撇子哲学家混合的桌子上,僵局都不会发生。我非常熟悉它的证明。 最近我在采访中遇到了以下问题。 有五位哲学家坐在圆桌旁。两个筷子之间各有一个哲学家。每个哲学家都需要两支筷子吃饭。我们有两种哲学家:左撇子和右撇子。左手先用左手拿筷子。右手先用右手拿筷子。假设五位哲学家中至少有一位左撇子和一位右撇子。以下哪一项是正确的: a) 独立于圆桌会议上的哲学家组合,没有僵局

  • 我正在努力解决这个问题。 就我而言,每个哲学家都应该吃100万次。问题是好像只有“1”,是“3”吃完了。我使用的线程与关键部分锁定,这是我的代码: 每个哲学家都必须交替思考和进食。然而,一个哲学家只有在有左右叉子的情况下才能吃意大利面。每把叉子只能由一位哲学家持有,因此只有在另一位哲学家没有使用叉子的情况下,一位哲学家才能使用叉子

  • 我的Java代码中有一个问题,它应该模拟pholosophers问题,如下所述:http://en.wikipedia.org/wiki/Dining_philosophers_problem我想输出所有哲学家的当前状态,每次他们中的一个吃饭或思考。输出应该是这样的:“OxOx(2)”,其中“X”表示哲学家在吃,“O”表示他在思考,“O”表示他在等筷子。括号中的数字表示状态已更改的哲学家的编号。我