1

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

当一个有叉子的哲学家收到请求消息时,如果叉子是干净的,他会保留叉子,但如果叉子脏了,他就会放弃。如果他把叉子送过来,他会在这样做之前清理叉子

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

ps:我是线程和并发的新手,把它当作一个学习项目。

编辑:给出叉子的实际位置,发布此消息以询问叉子是否应该是可变的。pLeft , pRight 是左右哲学家, fLeft 和 fRight 是左右叉子。

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;

    }

我还没有弄清楚在哪里同步它,但我觉得仍然需要同步。就像当两个用餐者时,说第一个和第三个向第二个哲学家要叉子。

4

1 回答 1

5

您引用的来源对此进行了解释:

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

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

于 2013-10-11T10:31:10.730 回答