Dev - C++ - semaforos e hilos

 
Vista:
Imágen de perfil de rocio
Val: 50
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

semaforos e hilos

Publicado por rocio (18 intervenciones) el 07/10/2020 05:09:45
tengo el siguiente codigo .c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
 
void *Receta(void *args){
   printf("A empezar");
   usleep(1000000);
}
void *cortar(){
   usleep(5000000);
   printf("ah cortado 2 dientes de ajo, cebolla y perejil!");
}
void *mezclar(){
   usleep(3000000);
   printf("ah mezclado los ingredietes con la carne");
}
void *salar(){  //seccion critica, uno solo usa la sal
   usleep(2000000);
   printf("ah agregado la sal a la carne");
}
void *medalones(){
   usleep(2000000);
   printf("ah formado los medallones");
}
void *planchar (){ //seccion critica, uno solo usa la plancha
   usleep(5000000);
   printf("ah puesto la carne en la plancha");
}
void *hornearPan(){  //seccion critica, solo uno utiliza el horno
   usleep(3000000);
   printf("ah puesto a hornear los panes");
}
 
void *tomateYlechuga(){
   usleep(2000000);
   printf("ah agregado la lechuga y tomates");
}
void *finalizar(){
   printf("ah terminado la hamburgesa!!");
}
 
int main(){
 
    pthread_t Equipo_1, Equipo_2, Equipo_3;
 
    pthread_create(&Equipo_1,NULL,Receta,NULL);
    pthread_create(&Equipo_2,NULL,Receta,NULL);
    pthread_create(&Equipo_3,NULL,Receta,NULL);
 
 
    pthread_join(Equipo_1,NULL);
    pthread_join(Equipo_2,NULL);
    pthread_join(Equipo_3,NULL);
 
    return 0;
}


tengo a su ves el sigiente .txt

1
2
3
4
5
6
7
8
9
Receta
paso1: cortar 2 dientes de ajo, cebolla y perejil
paso2: mezclar los ingredientes cortados con la carne
paso3: salar a gusto
paso4: formar medallones con la cane
paso5: planchar por 5 min la carne
paso6: hornearPan
paso7: agregarle tomateYlechuga
paso8: para finalizar emplate la hamburgesa


la idea seria.... Leer la receta desde el archivo (Se debe respetar el orden de la receta, La ejecución no puede ser secuencial, cada equipo comienza al mismo instante) Utilizar 3 hilos (threads) para simular los tres equipos, La salida debe escribirse en un archivo aparte, cada acción/paso de la receta deben simularla con un salida de texto.
Ejemplo: ¡Equipo 1 Horneando panes!, ¡Equipo 2, El pan está listo!, ¡Equipo 3 término las 2
hamburguesas! ¡Equipo 3 Gano!

Controlar la utilización del equipamiento compartido(plancha , horno, sal) ya que lo puede utilizar un equipo a la vez


Dos equipos no pueden estar horneando, usando la plancha o usando el salero a la vez.
¿Quién será el primero en entregar 2 hamburguesas al jurado?

La dificultad de la competencia es que la cocina no cuenta
con el equipamiento individual para cada equipo, sino que
algunos de ellos son compartidos. Se tienen que ordenar para
cocinar los medallones ya que solo tienen una plancha para todos
los equipos y esta cocina un medallón a la vez, existe solo un
horno que cocina dos panes a la vez y un solo salero
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

semaforos e hilos

Publicado por Nacho (181 intervenciones) el 07/10/2020 13:22:35
Tal y como lo tienes, la función Receta debería ir llamando el resto de funciones

1
2
3
4
5
6
7
8
9
10
11
12
void *Receta(void *args){
   printf("A empezar");
   cortar();
   mezclar();
   salar();
   medalones();
   planchar ();
   hornearPan();
   tomateYlechuga();
   finalizar();
   printf("ah terminado la hamburgesa!!");
}

Falta implementar las secciones críticas. Se utiliza una sección crítica cuando dos hilos a la vez pueden acceder a la misma zona de memoria. Entonces lo que hace un hilo es intentar entrar. Si no hay otro hilo accediendo se deja pasar, y entonces ese hilo entra en la sección crítica. Si otro hilo intenta entrar, como ya hay otro dentro, se detiene el hilo hasta que el primero libere esa sección crítica. Cuando el primero acaba libera la sección crítica y entonces entra el segundo. Ale.

http://profesores.elo.utfsm.cl/~agv/elo330/2s06/lectures/POSIX_threads/POSIX_Threads_Synchronization.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de rocio
Val: 50
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

semaforos e hilos

Publicado por rocio (18 intervenciones) el 07/10/2020 17:05:43
en si el ejercicio es una competencia entre 3 hilos que simulan un equipos y tienen q hacer lo de la receta
si leo el .txt mi problema (Actual) es ¿que le paso por parametro a los hilos?, osea, pude leer linea a linea el txt y a cada linea la guarde en una cadena, ahora me trabe en como segir
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

semaforos e hilos

Publicado por Nacho (181 intervenciones) el 07/10/2020 17:56:32
No sé quién ha definido Receta ni todas las demás funciones, pero no veo la necesidad de parámetros en Receta ni de que devuelvan todas un puntero void. Lo único que veo que falta es definir una variable a todo aquello que no pueda usar más de un cocinero a la vez (sal, plancha, horno) y meter el acceso a ellas a través de un mútex.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de rocio
Val: 50
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

semaforos e hilos

Publicado por rocio (18 intervenciones) el 07/10/2020 20:40:59
receta en si es un txt del como se hace una hamburgesa, las funciones las ise yo como para imprimir q estan haciendo los equipos y un tiempo de espera como simulando que lo hacen
lo que no se hacer (ademas de todo) es la parte de q cada hilo siga la receta tal cual
y que por pantalla vea un
equipo1 iso tal cosa
equipo2 esta haciendo tal cosa
equipo3 haciendo....
y que muestre quien termino primero
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

semaforos e hilos

Publicado por Nacho (181 intervenciones) el 07/10/2020 21:15:20
Que cada hilo siga la receta lo he hecho yo con la función Receta que te he puesto.
Con lo que has puesto tú
1
2
3
pthread_create(&Equipo_1,NULL,Receta,NULL);
pthread_create(&Equipo_2,NULL,Receta,NULL);
pthread_create(&Equipo_3,NULL,Receta,NULL);
se crean tres hilos que ejecutan cada uno esa función Receta. Esa función va llamando el resto de funciones que van imprimiendo lo que hacen. Si lo ejecutas así, como te he puesto la función Receta, ya lo tienes todo hecho menos la implementación de las seciones críticas, que ya te he dicho antes cómo se hace.

Quién terminó primero lo tienes en el main, pues el hilo del main se sincroniza con cada hilo, y no vuelven hasta que el hilo acabe. Para eso puedes pasarle un int a cada hilo y según el retorno, el main sabe qué hilo ha acabado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de rocio
Val: 50
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

semaforos e hilos

Publicado por rocio (18 intervenciones) el 07/10/2020 21:56:32
buenisimo gracias, ya se como arrancar ahora :´v estaba ya llorando de la impotencia....
la idea esta ahora me faltaria saber eso de que me imprima que hilo esta haciendo que cosa y mostrar quien termino primero.

lo horrible de esto es q los profes literal explican el tema pero no el como se hace... tengo q aprender el lenguaje C para hacer el trabajito este sin nunca haber tocado C en un tiempo limite de 1 semana :B
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar