我想知道为什么餐饮哲学家问题是基于五个哲学家的案例。为什么不四个?
我猜想我们在讨论五位哲学家的例子时也可以观察到所有令人不快的问题,当我们得到四位思想家时,也会发生。那仅仅是出于历史原因吗?
我想知道为什么餐饮哲学家问题是基于五个哲学家的案例。为什么不四个?
我猜想我们在讨论五位哲学家的例子时也可以观察到所有令人不快的问题,当我们得到四位思想家时,也会发生。那仅仅是出于历史原因吗?
Answers:
根据EWD310 “顺序过程的分层顺序”中的内容,看起来5是出于教育目的而选择的,目的是使学生更容易理解旨在演示解决问题的算法。
本文还进一步支持以下观点:5与一般问题并不真正相关,首先明确指出“该问题可能是由9或25位哲学家提出的……”,其次是通过同时进行两个操作来表示实体,“ A类和B类,共享相同的资源...”
Dijkstra使用的解决方案引入了三种“哲学家状态”:思考,饮食,饥饿。为解决该问题而提供的代码对这三个状态进行了操作,并且与此数量无关的哲学家也是如此。
作者是否会选择哲学家2、3或4的数量,这可能会导致阅读代码的学生感到困惑,无论选择的数量与州的数量或其他方面有关。这可以很容易地试图描述中提到的数字从EWD310引述如下测试:注:例如如何将改变[0:4]
到[0:3]
,[0:2]
,[0:1]
和语句涉及mod
。
与此相反,数字5看起来很纯真,并且不会调用不需要的关联。可以说,选择它是为了更好地说明哲学家的数量是任意的。
在EWD310中提出的算法如下:
...我们与每个哲学家关联一个状态变量,“ C”说,其中
C[i] = 0
意思是:哲学家i
在思考
C[i] = 2
意思是:哲学家i
在吃饭。...
我们为最后的过渡介绍了一种中间状态
C[i] = 1
意思是:哲学家i
饿了现在每个哲学家都将周期性地经过状态0、1、2、0 ......下一个要问的问题是:什么时候(危险的)哲学家从1过渡到2
K
?...
在宇宙中,我们假设已声明
1)
semaphore mutex
,最初= 12)
integer array C[0:4]
,最初所有元素= 03)
semaphore array prisem[0:4]
最初所有元素都为04)
procedure test (integer value K);
if C[(K-1) mod 5] ≠ 2 and C[K]= 1 and C[(K+1) mod 5] ≠ 2 do begin C[K]:= 2; V(prisem[K]) end;
(此过程可解决
K
存在时的不稳定问题,将仅在关键部分内调用该过程)。在这个宇宙中,哲学家的生活
w
现在可以被编码cycle begin think; P (mutex); C[w]:= 1; test (w); V(mutex); P(prisem[w]); eat P(mutex); C[w]:= 0; test [(w+l) mod 5]; test [(w-1) mod 5]; V(mutex) end
这就是我想要的解决方案……
只有Dijkstra可以肯定地回答,但我有足够的信心相信它是任意的。
“它最初是由Edsger Dijkstra于1965年制定的,它是一项学生考试练习,以计算机竞争访问磁带机外围设备的形式提出。不久之后,Tony Hoare提出了当前的问题。”
因为很奇怪,甚至没有。因此,您不必尝试设计依赖对称性或形成对的算法,只有很久以后才意识到它不适用于一般情况。
这是一种意见;对于作者的想法,我没有任何历史知识。