Согласно тому, что написано в EWD310 «Иерархическое упорядочение последовательных процессов» , похоже, что номер 5 был выбран для образовательных целей, чтобы облегчить студентам понимание алгоритма, предназначенного для демонстрации решения проблемы.
В этой самой статье далее поддерживается идея о том, что 5 на самом деле не имеет отношения к общей проблеме, во-первых, явно заявив, что «проблема могла быть поставлена для 9 или 25 философов ...», а затем, представив ее в виде двух одновременно работающих объекты "класс A и класс B, совместно использующие один и тот же ресурс ..."
Решение, используемое Дейкстрой, вводит три «состояния философа»: мышление, еда, голод. Код, представленный для решения проблемы, оперирует этими тремя состояниями вместе с не связанным с ним числом философов.
Если бы автор выбрал число философов 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
изначально = 1
2) то integer array C[0:4]
, что изначально весь элемент = 0
3) semaphore array prisem[0:4]
изначально все элементы = 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;
(Эта процедура, которая устраняет нестабильность в 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
И это завершает решение, к которому я стремился ...