Skip to content

Instantly share code, notes, and snippets.

@ACruz91
Created November 20, 2012 18:20
Show Gist options
  • Save ACruz91/4119807 to your computer and use it in GitHub Desktop.
Save ACruz91/4119807 to your computer and use it in GitHub Desktop.
Main de Fuma.cpp
#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 */
}
@gomezjdaniel
Copy link

for(i=0;i<3;i++)    {
    v[i]= new nFumador;
    v[i]->ingrediente=i;
}

@gomezjdaniel
Copy link

.tek certificado de calidad

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment