Jantar Dos Filosofos
Exames: Jantar Dos Filosofos. Pesquise 861.000+ trabalhos acadêmicosPor: Jackesvpa • 3/6/2014 • 565 Palavras (3 Páginas) • 426 Visualizações
FACUDADE COMUNITÁRIA DE CAMPINAS
ANHANGUERA - UNIDADE 2
PROGRAMAÇÃO CONCORRENTE
JANTAR DOS FILÓSOFOS
Jackes Ferreira Geraldo dos Santos RA: 1106280377
Marcos Vinicius Pereira de Arruda RA: 1186411530
Lion Justi Sebastiao Ra: 2583473961
Edson Emidio Rabelo RA: 1099459215
Thales Nastali RA: 1099440066
CAMPINAS
2013
Exercícios Sobre o Trabalho dos filósofos
Em ciência da computação, o problema do jantar dos filósofos ‚ um exemplo ilustrativo de um problema comum de programação concorrente. mais um problema clássico de sincronização multi - processo:
1) Cinco filósofos estão sentados ao redor de uma mesa circular para o jantar.
2) Cada filósofo possui um prato para comer macarrão.
3) Os filósofos dispõem de hashis e cada um precisa de 2 hashis para comer.
4) Entre cada par de pratos existe apenas um hashi: Hashis precisam ser compartilhados de forma sincronizada.
5) Os filósofos comem e pensam, alternadamente. Eles n„o se at‚m a apenas uma das tarefas.
6) Além disso, quando comem, pegam apenas um hashi por vez: Se conseguir pegar os dois come por alguns instantes e depois larga os hashis.
Resolução
/*******************************************************************/
/* Descricao programa: */
/* Jantar filosofos */
/*******************************************************************/
/*********************************/
/* Thales Nastali */
/* Data: 11/11/2013 */
/*********************************/
#include<stdio.h>
#include<pthread.h>
#define thread_num 5
#define max_refeicoes 40
/* uso inicial dos garfos */
/* 0 - garfo em uso */
/* 1 - garfo desocupado */
int garfos[thread_num]={1,1,1,1,1};
/* mutex_locks para cada garfo*/
pthread_mutex_t m[thread_num];
/* ID Filosofos */
int p[thread_num]={0,1,2,3,4};
/* numero de refeicoes consumidadas pelos filosofos */
int numRefeicoes[thread_num]={0,0,0,0,0};
int numTentativas[thread_num]={0,0,0,0,0};
/* contador para o numero de refeicoes */
int refeicoesCount = 0;
void *filosofo(void *); /* declaracao rotina filosofos */
int main()
{
pthread_t tid[thread_num];
void *status;
int i,j;
srand( (long)time(NULL) );
/* criando 5 threads para representar os filosofos */
for (i = 0; i < thread_num; i++)
{
if(pthread_create( tid + i, 0, filosofo, p + i ) != 0)
{
perror("Erro ao criar thread....");
exit(1);
}
}
/* join nas 5 threads */
for (i = 0; i < thread_num; i++)
{
if(!pthread_join(tid[i], &status )==0)
{
perror("thr_join() failure.");
exit(1);
}
}
printf("\n");
printf("------------------------------------------------------\n");
printf(" Jantar dos filosofos \n");
printf("------------------------------------------------------\n");
for(i=0; i<thread_num; i++)
printf("Filosofo %d tentou comer %d mas s¢ comeu %d refeicoes.\n", i,numTentativas[i] ,numRefeicoes[i]);
return (0);
}
void *filosofo(void *arg)
{
int sub = *(int*)arg;
//Enquanto menor que o maximo de refeicoes
while( refeicoesCount < max_refeicoes )
{
numTentativas[sub]++;
printf("Filosofo %d: Eu estou tentando comer!\n", sub);
/* lock garfo esquerdo */
pthread_mutex_lock( m + sub );
if( garfos[sub] == 1 )
{ /* o esquerdo est dispon¡vel */
printf("Filosofo
...