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

用餐哲学家:钱迪-米斯拉方法:如何避免僵局?

潘灵均
2023-03-14

我正在尝试,但有一个问题:在wiki中,该算法的第三点是:

当一个拿着叉子的哲学家收到一条请求消息时,如果叉子是干净的,他会保留它,但是当它脏的时候,他会放弃它。如果他把叉子送过来,他会先清洗叉子

我试图理解为什么这不会导致僵局?如果一个哲学家有一个干净的叉子,并等待从相邻的用餐者/哲学家那里得到另一个干净的叉子,而另一个用餐者/哲学家也在等待叉子,这可能会累积到僵局,对吗?一个哲学家总是等着另一个的叉子?

ps:我不熟悉线程和并发,把它作为一个学习项目。

编辑:给出叉子的实际位置,发布此信息询问叉子是否应该是可变的。普列夫特、普赖特是左派和右派哲学家,弗莱夫特和弗赖特是左派和右派哲学家。

private Fork giveFork(Philosopher diner) {
        Fork forkToGive;

        if (this.pLeft.equals(diner)) {
            // give left fork to left philosopher
            if (this.fLeft.isClean)
                forkToGive = null; // don't give
            else {
                forkToGive = new Fork(this.fLeft.id, true); // give the fork
            }

        } else if (diner.pRight.equals(this)) {
            // give right fork to right philosopher
            if (this.fRight.isClean)
                forkToGive = null;
            else {
                forkToGive = new Fork(this.fRight.id, true);
            }
        } else {
            // default value , i'm not yet sure if this code
            // can be theoretically reached
            forkToGive = null;
        }

        return forkToGive;

    }

我还没有弄清楚在哪里进行同步,但我确实觉得仍然需要同步。比如两个用餐者,第一个和第三个向第二个哲学家要叉子。

共有1个答案

彭宜人
2023-03-14

你引用的来源解释了这一点:

然而,如果系统被初始化为完全对称状态,就像所有哲学家持有左边的叉子一样,那么图从一开始就是循环的,他们的解决方案无法防止死锁。初始化系统,使ID较低的哲学家拥有脏叉,确保图形最初是非循环的。

因此,您需要将系统初始化为非对称状态,并且规则集的设计不允许离开所需的(非死锁状态)。

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

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

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

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

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

  • 我想用java信号量解决用餐哲学家的问题,但我被卡住了。最高ID的筷子应该是可用的,但它似乎总是采取,我不知道为什么。谁能告诉我我错在哪里了? Fork类: 哲学家班: 主要内容: