Selon ce qui est écrit dans EWD310 "Ordre hiérarchique des processus séquentiels" , il semble que le numéro 5 ait été choisi à des fins éducatives, afin de faciliter la compréhension par les élèves de l'algorithme conçu pour démontrer la solution du problème.
Ce même article soutient en outre l'idée que 5 n'est pas vraiment pertinent pour un problème général, d'abord en déclarant explicitement que "le problème aurait pu être posé pour 9 ou 25 philosophes ..." et ensuite, en le représentant en termes de deux fonctionnant simultanément entités, "classe A et classe B, partageant la même ressource ..."
La solution utilisée par Dijkstra introduit trois "états de philosophe": penser, manger, faim. Le code présenté pour résoudre le problème, exploite ces trois états, ainsi qu'un nombre sans rapport avec lui de philosophes.
Si l'auteur a choisi le nombre de philosophes 2, 3 ou 4, cela pourrait causer de la confusion aux étudiants qui lisent le code, que le nombre choisi soit lié à la quantité d'états ou à autre chose. Cela peut facilement être testé en essayant numéros mentionnés dans la description ci - dessous cités de EWD310: Note par exemple , comment cela changerait [0:4]
à [0:3]
, [0:2]
, [0:1]
et les déclarations concernant mod
.
Par opposition à cela, le numéro 5 semble assez innocent et n'invoque pas d'associations inutiles. On peut dire qu'il a été choisi pour mieux illustrer cette quantité de philosophes est bien arbitraire .
L'algorithme mentionné est présenté dans EWD310 comme suit:
... nous associons à chaque philosophe une variable d'état, disons "C", où
C[i] = 0
signifie: le philosophe i
pense
C[i] = 2
signifie: le philosophe i
mange.
...
on introduit pour la dernière transition un état intermédiaire
C[i] = 1
signifie: le philosophe i
a faim
Maintenant, chaque philosophe passera cycliquement par les états 0, 1, 2, 0 ...... La prochaine question à se poser est: quand la transition (dangereuse) de 1 à 2 a-t-elle lieu pour le philosophe K
?
...
Dans l'univers, nous supposons déclaré
1) le semaphore mutex
, initialement = 1
2) le integer array C[0:4]
, avec initialement tout élément = 0
3) le semaphore array prisem[0:4]
avec initialement tous les éléments = 0
4) 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;
(Cette procédure, qui résout l'instabilité K
lorsqu'elle est présente, ne sera appelée qu'à partir d'une section critique).
Dans cet univers, la vie du philosophe w
peut maintenant être codée
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
Et cela conclut la solution que je visais ...