Concurrency 餐饮哲学家';s监视器解决方案:`pickup(i)`是否需要间接调用`self[i].signal()`呢?

Concurrency 餐饮哲学家';s监视器解决方案:`pickup(i)`是否需要间接调用`self[i].signal()`呢?,concurrency,operating-system,computer-science,monitor,dining-philosopher,Concurrency,Operating System,Computer Science,Monitor,Dining Philosopher,从操作系统概念 5.8.2使用监视器的解决方案 接下来,我们通过介绍无死锁的监视器来说明监视器的概念 解决问题的方法。这一解决方案规定了 限制哲学家只能在两种情况下拿起筷子 其中一个是可用的。要编写此解决方案,我们需要区分 在三个州中,我们可以找到一位哲学家。为此 目的:我们介绍以下数据结构: enum {THINKING, HUNGRY, EATING} state[5]; 哲学家只有当她有两个 邻居没有吃饭:(州[(i+4)%5]!=吃饭)和 (声明[(i+1)%5]!=吃) 我们还需要申

从操作系统概念

5.8.2使用监视器的解决方案

接下来,我们通过介绍无死锁的监视器来说明监视器的概念 解决问题的方法。这一解决方案规定了 限制哲学家只能在两种情况下拿起筷子 其中一个是可用的。要编写此解决方案,我们需要区分 在三个州中,我们可以找到一位哲学家。为此 目的:我们介绍以下数据结构:

enum {THINKING, HUNGRY, EATING} state[5];
哲学家只有当她有两个 邻居没有吃饭:
(州[(i+4)%5]!=吃饭)
(声明[(i+1)%5]!=吃)

我们还需要申报

condition self[5];
这使得哲学家我可以在她饿了但不饿的时候耽搁自己 无法获得她需要的筷子

monitor DiningPhilosophers
{

    enum {THINKING, HUNGRY, EATING} state[5];
    condition self[5];
    void pickup(int i) {

        state[i] = HUNGRY;
        test(i);
        if (state[i] != EATING)
            self[i].wait();

    }
    void putdown(int i) {

        state[i] = THINKING;
        test((i + 4) % 5);
        test((i + 1) % 5);

    }
    void test(int i) {

        if ((state[(i + 4) % 5] != EATING) &&
        (state[i] == HUNGRY) &&
        (state[(i + 1) % 5] != EATING)) {
            state[i] = EATING;
            self[i].signal();
        }

    }
    initialization code() {

        for (int i = 0; i < 5; i++)
            state[i] = THINKING;
    }

}
pickup(i)
调用
test(i)
,当条件满足时,它依次调用
self[i].signal()。
pickup(i)
是否需要间接调用
self[i].signal()


谢谢。

signal()
的调用在拾取期间无效,因为它向当前线程发出信号,根据定义,当前线程不能处于等待状态

不,这是一个丢失的信号,但这对放下很重要(i)
DiningPhilosophers.pickup(i);
...
eat
...
DiningPhilosophers.putdown(i);