TrabalhosGratuitos.com - Trabalhos, Monografias, Artigos, Exames, Resumos de livros, Dissertações
Pesquisar

Jantar Dos Filosofos

Exames: Jantar Dos Filosofos. Pesquise 861.000+ trabalhos acadêmicos

Por:   •  3/6/2014  •  565 Palavras (3 Páginas)  •  426 Visualizações

Página 1 de 3

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

...

Baixar como (para membros premium)  txt (5.3 Kb)  
Continuar por mais 2 páginas »
Disponível apenas no TrabalhosGratuitos.com