Concurrency 餐饮哲学家';s监视器解决方案:`pickup(i)`是否需要间接调用`self[i].signal()`呢?
从操作系统概念 5.8.2使用监视器的解决方案 接下来,我们通过介绍无死锁的监视器来说明监视器的概念 解决问题的方法。这一解决方案规定了 限制哲学家只能在两种情况下拿起筷子 其中一个是可用的。要编写此解决方案,我们需要区分 在三个州中,我们可以找到一位哲学家。为此 目的:我们介绍以下数据结构: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]!=吃) 我们还需要申
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);