Filosofos Comensales
Enviado por jorgiuxxx • 17 de Octubre de 2013 • 270 Palabras (2 Páginas) • 718 Visitas
Elaborar una solución para el problema de los Filósofos comensales utilizando Regiones Críticas con OpenMP.
Condiciones del problema:
- Cinco filósofos.
- Mesa redonda con cinco platos.
- Cinco tenedores, cada uno entre los platos.
- Estados de los filósofos: Pensando, hambriento y comiendo.
- Para que un filósofo pueda comer necesita tomar los dos tenedores.
- Solo dos filósofos pueden estar comiendo al mismo tiempo.
- Evitar que algún filósofo se quede sin comer.
- Puede basarse en el programa de ejemplo que se encuentra en Link Sharing, dentro de esta plataforma. Este programa está incompleto y deberá complementarlo para que cumpla con los requierimientos.
Criterios de evaluación:
- Debe cumplir con los todos los requisitos establecidos.
- Individual.
- Fecha de entrega: 1 de octubre del 2013. Se revisará durante la clase.
#include "stdafx.h"
#include <omp.h>
#include <time.h>
#include <cstdlib>
#define N 5
#define LEFT (i-1)%N
#define RIGHT (i+1)%N
#define THINKING 0
#define HUNGRY 1
#define EATING 2
int state[N],x;
void verificarTenedores(int i){
if(i>0 && i<4)
{
if(state[i]==HUNGRY && state[i-1]!= EATING && state[i+1]!=EATING)
state[i]=EATING;
}
Else
if(i==0)
{
if(state[i]==HUNGRY && state[4]!= EATING && state[1]!=EATING
state[i]=EATING;
}
else
{
if(i==4)
if(state[i]==HUNGRY && state[3]!= EATING && state[0]!=EATING)
state[i]=EATING;
} }
void sleep(unsigned int mseconds)
{
clock_t goal = mseconds + clock();
while (goal > clock());
}
void metPensar(int i){
if(state[i]==THINKING)
printf("El filosofo %d esta PENSANDO\n",omp_get_thread_num());
sleep(2000);
}
void metComer(int i){
if(state[i]==EATING)
printf("El filosofo %d esta COMIENDO\n",omp_get_thread_num());
sleep(2000);
}
void metTomarTenedores(int i)
{
#pragma omp critical (mutex)
{
state[i]=HUNGRY;
printf("El filosofo %d esta HAMBRIENTO\n",omp_get_thread_num());
sleep(2000);
verificarTenedores(i);
} }
void metDejarTenedores(int i)
{
#pragma omp critical (mutex) {
state[i]=THINKING;
if(i>0 && i<4)
{
verificarTenedores(i-1);
verificarTenedores(i+1);
}
else
...