Secondo quanto scritto in EWD310 "Ordinamento gerarchico di processi sequenziali" , sembra che il numero 5 sia stato scelto a fini educativi, al fine di facilitare agli studenti la comprensione dell'algoritmo progettato per dimostrare la soluzione del problema.
Questo documento sostiene ulteriormente l'idea che il 5 non è realmente rilevante per il problema generale, in primo luogo affermando esplicitamente che "il problema avrebbe potuto essere posto per 9 o 25 filosofi ..." e poi, rappresentandolo in termini di due operazioni simultanee entità, "classe A e classe B, che condividono la stessa risorsa ..."
La soluzione usata da Dijkstra introduce tre "stati filosofici": pensare, mangiare, fame. Il codice presentato per risolvere il problema, gestisce questi tre stati, insieme a un numero non correlato di filosofi.
L'autore avrebbe scelto il numero di filosofi 2, 3 o 4, questo potrebbe causare confusione tra gli studenti che leggono il codice, sia che il numero scelto sia correlato alla quantità di stati o qualcos'altro. Questo può essere facilmente testato provando numeri citati nella descrizione citati da EWD310 di seguito: nota ad esempio come questo possa cambiare [0:4]
a [0:3]
, [0:2]
, [0:1]
e le dichiarazioni che coinvolgono mod
.
Al contrario, il numero 5 sembra abbastanza innocente e non invoca associazioni non necessarie. Si può dire che è stato scelto per illustrare meglio che la quantità di filosofi è, beh, arbitraria .
L'algoritmo menzionato è presentato in EWD310 come segue:
... associamo ad ogni filosofo una variabile di stato, diciamo "C", dove
C[i] = 0
significa: il filosofo i
sta pensando
C[i] = 2
significa: il filosofo i
sta mangiando.
...
introduciamo per l'ultima transizione uno stato intermedio
C[i] = 1
significa: il filosofo ha i
fame
Ora ogni filosofo attraverserà ciclicamente gli stati 0, 1, 2, 0 ...... La prossima domanda da porsi è: quando deve avvenire la (pericolosa) transizione da 1 a 2 per il filosofo K
?
...
Nell'universo assumiamo dichiarato
1) il semaphore mutex
, inizialmente = 1
2) the integer array C[0:4]
, con inizialmente tutto element = 0
3) il semaphore array prisem[0:4]
con inizialmente tutti gli elementi = 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;
(Questa procedura, che risolve l'instabilità per K
quando presente, verrà chiamata solo all'interno di una sezione critica).
In questo universo la vita del filosofo w
può ora essere codificata
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
E questo conclude la soluzione a cui stavo puntando ...