Created
November 20, 2012 18:20
-
-
Save ACruz91/4119807 to your computer and use it in GitHub Desktop.
Main de Fuma.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
#include <pthread.h> | |
#include <semaphore.h> | |
#include <iostream> | |
#include <time.h> | |
using namespace std; | |
struct nFumador{ int ingrediente; }; | |
/** Declara los semaforos que necesites */ | |
sem_t screen, estanquero, fumador1, fumador2, fumador3; | |
int nfumadores=3; | |
//Funcion liar cigarro | |
void liar_cigarro(int fumador){ | |
/** Segun el indice 'fumador' que se le pase, imprime el numero de fumador que lia su cigarro */ | |
sem_wait(&screen); | |
cout << "El fumador" <<fumador<< "esta liando un cigarro " << endl; | |
sem_post(&screen); | |
//reposando, un poco, despues | |
sleep(5); | |
}//liar() | |
//Funcion estanco | |
void * estanco(void *arg){ | |
//Esta funcion la ejecutara la hebra estanquero | |
int objeto1, objeto2; | |
// inicializa semilla aleatoria | |
srand(time(NULL)); | |
while(1){ | |
/** falta sincronizacion para que el estanquero no se adelante si el ultimo fumador no termino de liar */ | |
sem_wait(&estanquero); | |
//Ahora el estanquero pone 2 ingredientes aleatorios encima de la mesa | |
//Que se generan utilizando la funcion rand() | |
cout << "Poniendo los ingredientes: " << endl; | |
/** Generar valores distintos dentro del rango [0..2] | |
* para las variables 'objeto1' y 'objeto2' */ | |
objeto1=rand()%3; | |
objeto2=rand()%3; | |
while(objeto1==objeto2) | |
objeto1=rand()%3; | |
if(objeto1+objeto2==3){ | |
sem_wait(&screen); | |
cout << "Papel y Cerillas" << endl; | |
sem_post(&screen); | |
sem_post(&fumador1); | |
} | |
if(objeto1+objeto2==2){ | |
sem_wait(&screen); | |
cout << "Tabaco y Cerillas" << endl; | |
sem_post(&screen); | |
sem_post(&fumador2); | |
} | |
if(objeto1+objeto2==1){ | |
sem_wait(&screen); | |
cout << "Tabaco y Papel" << endl; | |
sem_post(&screen); | |
sem_post(&fumador3); | |
} | |
/** tengo cuidado que no sean 2 ingredientes iguales */ | |
/** Dependiendo de los valores de las variables 'objeto?' | |
* imprimir el mensaje apropiado: | |
* cout << "Papel y Cerillas" << endl; | |
* cout << "Tabaco y Cerillas" << endl; | |
* cout << "Tabaco y Papel" << endl; | |
* Incluyendo en cada opcion anterior la sincronizacion apropiada para el fumador indicado | |
*/ | |
}//while | |
}//estanco() | |
//Funcion fumadora | |
void * fumar(void *arg){ | |
//Esta funcion la ejecutaran todas las hebras fumadoras | |
/**Dependiendo de los ingredientes que posea segun su | |
* numero de fumador ((nFumador*)arg)->ingrediente), | |
* tendra que sincronizarse con la opcion adecuada de | |
* la hebra estanquero para obtener el ingrediente | |
* que le falta para liar su cigarro y fumar | |
*/ | |
nFumador *v=(nFumador*)arg; | |
int fumador=v->ingrediente; | |
while(1){ | |
/**Dependiendo del fumador del que se trate, se imprimiran ahora | |
* uno de los siguientes mensajes: | |
* cout << "Recoge papel y cerillas el fumador 1" << endl; | |
* cout << "Recoge tabaco y cerillas el fumador 2" << endl; | |
* cout << "Recoge tabaco y papel el fumador 3" << endl; | |
*/ | |
if(fumador==0){ | |
sem_wait(&screen); | |
cout << "Recoge papel y cerillas el fumador 1" << endl; | |
sem_post(&screen); | |
sem_post(&fumador1); | |
} | |
if(fumador==1){ | |
sem_wait(&screen); | |
cout << "Recoge tabaco y cerillas el fumador 2" << endl; | |
sem_post(&screen); | |
sem_post(&fumador2); | |
} | |
if(fumador==2){ | |
sem_wait(&screen); | |
cout << "Recoge tabaco y papel el fumador 3" << endl; | |
sem_post(&screen); | |
sem_post(&fumador3); | |
} | |
}//Ojo! que falta la sincronizacion con la hebra estanquero | |
sem_wait(&estanquero); | |
/** Avisar al estanquero para que coloque 2 nuevos ingredientes */ | |
sem_post(&estanquero); | |
/** Ahora, se llama a la funcion liar cigarro */ | |
liar_cigarro(nfumadores); | |
/** Imprimir uno de los siguientes mensajes para informar de quien fuma | |
* cout << "Fumando el fumador 1" << endl; | |
* cout << "Fumando el fumador 2" << endl; | |
* cout << "Fumando el fumador 3" << endl; | |
*/ | |
if(fumador==0){ | |
sem_wait(&screen); | |
cout << "Fumando el fumador 1" << endl; | |
sem_post(&screen); | |
sem_post(&fumador1); | |
} | |
if(fumador==1){ | |
sem_wait(&screen); | |
cout << "Fumando el fumador 2" << endl; | |
sem_post(&screen); | |
sem_post(&fumador2); | |
} | |
if(fumador==2){ | |
sem_wait(&screen); | |
cout << "Fumando el fumador 3" << endl; | |
sem_post(&screen); | |
sem_post(&fumador3); | |
} | |
//Fumar lleva un tiempo, por supuesto! | |
sleep(10); | |
//Ir acabando este turno ordenadamente | |
if (fumador== 0) cout << "Termina de fumar el fumador 1" << endl; | |
if (fumador== 1) cout << "Termina de fumar el fumador 2" << endl; | |
if (fumador== 2) cout << "Termina de fumar el fumador 3" << endl; | |
}//while | |
}//fumadora() | |
int main (int argc, char *argv[]){ | |
// Declarar las 4 hebras necesarias para implementarlo | |
pthread_t estanquero,fumador1,fumador2,fumador3; | |
/** Iniciar 'ingrediente' de la estructura 'nFumador' con un valor:[0..2], | |
* asociado a cada hebra fumadora para diferenciarlas */ | |
nFumador *v[3]; | |
/** Y crearse una variable dinamica para contener el valor de 'ingrediente' para cada fumador | |
//...el fumador ? con tabaco | |
//...el fumador ? con papel | |
//...el fumador ? con cerillas | |
**** que se pasara como cuarto argumento en la funcion de creacion de hebra correspondiente */ | |
for(i=0;i<3;i++){ | |
v[i]=new nFumador; | |
v[i]->ingrediente=i; | |
} | |
for(i=0;i<3;i++) | |
delete nFumador v[i]; | |
/** Iniciar los semaforos, teniendo en cuenta que la hebra estanquero ha de comenzar | |
* la simulacion poniendo los primeros ingredientes */ | |
sem_init(&estanquero, 0, 1); | |
sem_init(&fumador1, 0, 0); | |
sem_init(&fumador2, 0, 0); | |
sem_init(&fumador3, 0, 0); | |
sem_init(&screen, 0, 1); | |
/** Crear y lanzar la ejecucion de 4 hebras: 3 fumadores y 1 estanquero, | |
* la funcionalidad vendra dada por una de funciones anteriormente | |
* descritas como: estanco() y fumar() segun el tipo de hebra del que se trate */ | |
pthread_create(&estanquero, NULL, estanco, NULL); | |
pthread_create(&fumador1, NULL, fumar, v[0]); | |
pthread_create(&fumador2, NULL, fumar, v[1]); | |
pthread_create(&fumador3, NULL, fumar, v[2]); | |
/** Recoger las hebras al terminar, segun el orden de creacion */ | |
pthread_join(estanquero, NULL); | |
pthread_join(fumador1, NULL); | |
pthread_join(fumador2, NULL); | |
pthread_join(fumador3, NULL); | |
/** Destrucción de los Semáforos */ | |
sem_destroy(&estanquero); | |
sem_destroy(&fumador1); | |
sem_destroy(&fumador2); | |
sem_destroy(&fumador3); | |
sem_destroy(&screen); | |
/** Liberamos memoria */ | |
for(i=0;i<3;i++) | |
delete nFumador v[i]; | |
cout << "Fin del programa \n" << endl; | |
/** No olvidar destruir los semaforos antes de terminar el programa */ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment