Per quanto scritto in EWD310 "Ordinamento gerarchico di processi sequenziali" , sembra che il numero 5 sia stato scelto a scopo didattico, al fine di rendere più facile per gli studenti la comprensione dell'algoritmo progettato per dimostrare la soluzione del problema.
Questo stesso documento sostiene ulteriormente l'idea che 5 non sia realmente rilevante per il problema generale, in primo luogo affermando esplicitamente che "il problema avrebbe potuto essere posto per 9 o 25 filosofi ..." e successivi , rappresentandolo in termini di due entità operative simultaneamente, "classe A e classe B, condividendo la stessa risorsa ..."
La soluzione usata da Dijkstra introduce tre "stati del filosofo": pensare, mangiare, fame. Il codice presentato per risolvere il problema, gestisce questi tre stati, insieme a un numero di filosofi non correlato .
L'autore avrebbe scelto il numero di filosofi 2, 3 o 4, questo potrebbe causare confusione tra gli studenti che leggono il codice, se il numero scelto è correlato alla quantità di stati o qualcos'altro. Questo può essere facilmente provato provando i citati numeri nella descrizione citata dall'EWD310 qui sotto: nota per esempio come questo cambierebbe [0:4]
in [0:3]
, [0:2]
, [0:1]
e affermazioni che coinvolgono mod
.
Contrariamente a questo, il numero 5 sembra abbastanza innocente e non richiama associazioni non necessarie. Si può dire che è stato scelto per meglio illustrare quella quantità di filosofi è, beh, arbitrario .
L'algoritmo menzionato viene presentato in EWD310 come segue:
...we associate with each philosopher a state variable, "C" say, where
C[i] = 0
means: philosopher i
is thinking
C[i] = 2
means: philosopher i
is eating.
...
we introduce for the last transition an intermediate state
C[i] = 1
means: philosopher i
is hungry
Now each philosopher will go cyclically through the states 0, 1, 2, 0 ...... The next question to ask is: when has the (dangerous) transition from 1 to 2 to take place for philosopher K
?
...
In the universe we assume declared
1) the semaphore mutex
, initially = 1
2) the integer array C[0:4]
, with initially all element = 0
3) the semaphore array prisem[0:4]
with initially all elements = 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;
(This procedure, which resolves unstability for K
when present, will only be called from within a critical section).
In this universe the life of philosopher w
can now be coded
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
And this concludes the solution I was aiming at...