Jantar Dos Fil Sofos
ESCOLA SUPERIOR DE TECNOLOGIA
LICENCIATURA EM INFORMÁTICA
Victor Freire de Oliveira
José da Gama Gurgel
Sandro dos Santos Ferreira
Elcimar Cândido Ferreira
Kleyton Ricardo Matos de Souza
PROBLEMAS CLÁSSICOS DE SINCRONIZAÇÃO DE PROCESSOS: JANTAR DOS FILÓSOFOS
MANAUS
2014
APRESENTAÇÃO DO PROBLEMA: JANTAR DOS FILÓSOFOS
Em 1965, Dijkstra formulou e resolveu um problema de sincronização que ele chamou de problema do jantar dos filósofos. Desde então, cada um que inventasse mais uma primitiva de sincronização via-se obrigado a demonstrar até que ponto essa nova primitiva era maravilhosa, mostrando com que elegância ela resolvia o problema do jantar dos filósofos. O problema pode ser explicado de maneira muito simples. Cinco filósofos estão sentados em torno de uma mesa circular. Cada filósofo tem um prato de espaguete. O espaguete está tão escorregadio que um filósofo precisa de dois garfos para comê-lo. Entre cada par de pratos está um garfo e eles precisam ser compartilhados de forma sincronizad:
Os filósofos comem e pensam alternadamente, não se atém a apenas uma das tarefas. Além disso quando comem pegam apenas um garfo por vez e se conseguirem pegar os dois, comem por alguns instantes e depois larga os garfos. Na informática a questão é: Como escrever um programa que faça o que deve fazer e nunca trave?
Resolução do problema:
Take fork (Pegar o garfo) Implementação do Take fork:
#define N 5 //número de filósofos void philosopher(int i) //i: número de filósofos de 0 a 4
{
while(TRUE){ think(); // filósofo está pensando take_fork(i); // pega o garfo esquerdo take_fork((i+1)%N); // pega o garfo direito; % é o operador módulo eat(); // come put_fork(i); // devolve o garfo esquerdo à mesa put_fork((i+1)%N); // devolve o garfo direito à mesa }
}
Isso resolve?
Não, pois se todos os filósofos pegar o garfo da esquerda nenhum pegará o da direita.
A solução para