当前位置: 首页 > 编程笔记 >

餐饮哲学家问题(DPP)

霍浩皛
2023-03-14
本文向大家介绍餐饮哲学家问题(DPP),包括了餐饮哲学家问题(DPP)的使用技巧和注意事项,需要的朋友参考一下

餐饮哲学家的问题指出,有5位哲学家共享一张圆桌,他们交替吃饭和思考。每个哲学家都有一碗饭和5根筷子。哲学家需要左右筷子才能吃饭。饿了的哲学家只有在两把筷子都齐备的情况下才可以吃东西,否则哲学家放下筷子,重新开始思考。

餐饮哲学家是一个经典的同步问题,因为它演示了一大类并发控制问题。

餐饮哲学家问题的解决方案

餐饮哲学家问题的一个解决方案是使用信号量代表筷子。可以通过在信号量上执行等待操作来拿起筷子,并通过执行信号量来释放筷子。

筷子的结构如下所示-

semaphore chopstick [5];

最初,筷子的元素被初始化为1,因为筷子在桌子上,而没有被哲学家拿起。

随机哲学家i的结构如下-

do {
   wait( chopstick[i] );
   wait( chopstick[ (i+1) % 5] );
   . .
   . EATING THE RICE
   .
   signal( chopstick[i] );
   signal( chopstick[ (i+1) % 5] );
   .
   . THINKING
   .
} while(1);

在上述结构中,对筷子[i]和筷子[(i + 1)%5]执行第一等待操作。这意味着哲学家我已经拿起了他身边的筷子。然后执行进餐功能

之后,对筷子[i]和筷子[(i + 1)%5]进行信号操作。这意味着我已经吃了哲学家,把筷子放到了他的身边。然后,哲学家回到思考。

解决方案困难

上述解决方案确保了没有两个相邻的哲学家可以同时吃饭。但是此解决方案可能导致死锁。如果所有哲学家都同时拿起左筷子,可能会发生这种情况。然后他们都不吃,死锁发生。

一些避免死锁的方法如下-

  • 桌子上最多应有四位哲学家。

  • 偶数哲学家应先选择右筷子,然后左筷子,而奇数哲学家应先选择左筷子,然后右筷子。

  • 仅当哲学家和哲学家同时可用时,才允许他们拿起筷子。

 类似资料:
  • 根据这篇维基百科文章中的钱迪/米斯拉部分,我们有5位哲学家,编号为P1-P5。 根据这句话: 对于每一对争夺资源的哲学家,创建一个叉子,并将其交给具有较低ID的哲学家(n代表代理Pn)。每个叉子可以是脏的或干净的。最初所有的叉子都是脏的 当一个有叉子的哲学家收到一个请求消息时,如果叉子是干净的,他会保留它,但是如果叉子是脏的,他会放弃它。如果他把叉子送过去,他会先把叉子清理干净。 因此,如果知道所

  • 我试图在netlogo中实现一个拍卖概念——它类似于餐饮哲学家问题程序。 我的程序处理与用餐哲学家程序中的哲学家和叉子相对应的计算机和处理器。在哲学家程序中,用户需要两把叉子才能吃饭,但在计算机和处理器中,一台计算机需要一个处理器才能工作。 我的程序中定义的状态是:,,,对应于哲学家程序中的,,。 目前,我的程序将所有计算机的状态更改为。我有问题在获取服务器的计算机。 代码片段是-

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

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

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

  • 我必须用信号量来解决这个问题。在我的代码中,每一个哲学家都在拿一根筷子,其他人都在等待。 我在主函数中仍然有一些错误。你能告诉我怎么使用筷子吗?我是BACI的初学者。