Zgodnie z tym, co napisano w EWD310 „Hierarchiczne porządkowanie procesów sekwencyjnych” , wygląda na to, że numer 5 został wybrany do celów edukacyjnych, aby ułatwić uczniom zrozumienie algorytmu zaprojektowanego w celu zademonstrowania rozwiązania problemu.
Ten sam artykuł dodatkowo popiera ideę, że 5 nie jest tak naprawdę istotny dla ogólnego problemu, po pierwsze, wyraźnie stwierdzając, że „problem mógł zostać postawiony dla 9 lub 25 filozofów ...”, a następnie, reprezentując go w kategoriach dwóch jednocześnie działających podmioty „klasy A i klasy B dzielące ten sam zasób ...”
Rozwiązanie zastosowane przez Dijkstrę wprowadza trzy „stany filozofa”: myślenie, jedzenie, głód. Kod przedstawiony w celu rozwiązania problemu obsługuje te trzy stany wraz z niepowiązaną z nim liczbą filozofów.
Gdyby autor wybrał liczbę filozofów 2, 3 lub 4, mogłoby to spowodować zamieszanie uczniów czytających kod, niezależnie od tego, czy wybrana liczba jest związana z ilością stanów, czy czymś innym. To może być łatwo testowane przez próby wymienione w opisie podane numery od EWD310 poniżej: uwaga na przykład jak by to zmienić [0:4]
, aby [0:3]
, [0:2]
, [0:1]
i oświadczenia udziałem mod
.
W przeciwieństwie do tego, numer 5 wygląda dość niewinnie i nie wywołuje niepotrzebnych skojarzeń. Można powiedzieć, że wybrano to, aby lepiej zilustrować, że liczba filozofów jest, cóż, arbitralna .
Wspomniany algorytm przedstawiono w EWD310 w następujący sposób:
... kojarzymy z każdym filozofem zmienną stanu, powiedzmy „C”, gdzie
C[i] = 0
oznacza: filozof i
myśli
C[i] = 2
oznacza: filozof i
je.
...
dla ostatniego przejścia wprowadzamy stan pośredni
C[i] = 1
oznacza: filozof i
jest głodny
Teraz każdy filozof będzie cyklicznie przechodził przez stany 0, 1, 2, 0 ...... Następnym pytaniem jest: kiedy (niebezpieczne) przejście od 1 do 2 nastąpi dla filozofa K
?
...
We wszechświecie zakładamy, że jest zadeklarowany
1) semaphore mutex
początkowo = 1
2) integer array C[0:4]
początkowo wszystkie elementy = 0
3) semaphore array prisem[0:4]
z początkowo wszystkimi elementami = 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;
(Ta procedura, która rozwiązuje niestabilność, K
gdy jest obecna, będzie wywoływana tylko z sekcji krytycznej).
W tym wszechświecie w
można teraz zakodować życie filozofa
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
I na tym kończy się rozwiązanie, do którego dążyłem ...