De acordo com o que está escrito no EWD310 "Pedido hierárquico de processos sequenciais" , parece que o número 5 foi escolhido para fins educacionais, a fim de facilitar aos alunos o entendimento do algoritmo projetado para demonstrar a solução do problema.
Este mesmo artigo apóia ainda mais a idéia de que 5 não é realmente relevante para o problema geral, primeiro declarando explicitamente que "o problema poderia ter sido colocado para 9 ou 25 filósofos ..." e depois representando-o em termos de duas operações simultâneas. entidades " , classe A e classe B, compartilhando o mesmo recurso ..."
A solução usada por Dijkstra introduz três "estados do filósofo": pensando, comendo, com fome. O código apresentado para resolver o problema opera esses três estados, juntamente com um número não relacionado a ele de filósofos.
Se o autor tivesse escolhido o número de filósofos 2, 3 ou 4, isso poderia causar confusão para os alunos que lêem o código, se o número escolhido está relacionado à quantidade de estados ou a qualquer outra coisa. Isso pode ser facilmente testado por tentando números mencionados na descrição citadas de EWD310 abaixo: nota, por exemplo, como isso mudaria [0:4]
a [0:3]
, [0:2]
, [0:1]
e declarações envolvendo mod
.
Ao contrário, o número 5 parece bastante inocente e não invoca associações desnecessárias. Pode-se dizer que foi escolhido para ilustrar melhor que a quantidade de filósofos é, bem, arbitrária .
O algoritmo mencionado é apresentado no EWD310 da seguinte maneira:
... associamos a cada filósofo uma variável de estado "C", onde
C[i] = 0
significa: filósofo i
está pensando
C[i] = 2
significa: filósofo i
está comendo.
...
introduzimos para a última transição um estado intermediário
C[i] = 1
significa: filósofo i
está com fome
Agora, cada filósofo passará ciclicamente pelos estados 0, 1, 2, 0 ...... A próxima pergunta a fazer é: quando é que a transição (perigosa) de 1 para 2 ocorre para o filósofo K
?
...
No universo, assumimos declarado
1) o semaphore mutex
, inicialmente = 1
2) o integer array C[0:4]
, com inicialmente todo o elemento = 0
3) semaphore array prisem[0:4]
com inicialmente todos os elementos = 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;
(Este procedimento, que resolve a instabilidade K
quando presente, será chamado apenas de dentro de uma seção crítica).
Neste universo, a vida do filósofo w
agora pode ser codificada
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 isso conclui a solução que eu estava buscando ...