-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsubwayArgento.c
195 lines (148 loc) · 6.01 KB
/
subwayArgento.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <stdio.h> // libreria estandar
#include <stdlib.h> // para usar exit y funciones de la libreria standard
#include <string.h>
#include <pthread.h> // para usar threads
#include <semaphore.h> // para usar semaforos
#include <unistd.h>
#define LIMITE 50
//creo estructura de semaforos
struct semaforos {
sem_t sem_mezclar;
//poner demas semaforos aqui
};
//creo los pasos con los ingredientes
struct paso {
char accion [LIMITE];
char ingredientes[4][LIMITE];
};
//creo los parametros de los hilos
struct parametro {
int equipo_param;
struct semaforos semaforos_param;
struct paso pasos_param[8];
};
//funcion para imprimir las acciones y los ingredientes de la accion
void* imprimirAccion(void *data, char *accionIn) {
struct parametro *mydata = data;
//calculo la longitud del array de pasos
int sizeArray = (int)( sizeof(mydata->pasos_param) / sizeof(mydata->pasos_param[0]));
//indice para recorrer array de pasos
int i;
for(i = 0; i < sizeArray; i ++){
//pregunto si la accion del array es igual a la pasada por parametro (si es igual la funcion strcmp devuelve cero)
if(strcmp(mydata->pasos_param[i].accion, accionIn) == 0){
printf("\tEquipo %d - accion %s \n " , mydata->equipo_param, mydata->pasos_param[i].accion);
//calculo la longitud del array de ingredientes
int sizeArrayIngredientes = (int)( sizeof(mydata->pasos_param[i].ingredientes) / sizeof(mydata->pasos_param[i].ingredientes[0]) );
//indice para recorrer array de ingredientes
int h;
printf("\tEquipo %d -----------ingredientes : ----------\n",mydata->equipo_param);
for(h = 0; h < sizeArrayIngredientes; h++) {
//consulto si la posicion tiene valor porque no se cuantos ingredientes tengo por accion
if(strlen(mydata->pasos_param[i].ingredientes[h]) != 0) {
printf("\tEquipo %d ingrediente %d : %s \n",mydata->equipo_param,h,mydata->pasos_param[i].ingredientes[h]);
}
}
}
}
}
//funcion para tomar de ejemplo
void* cortar(void *data) {
//creo el nombre de la accion de la funcion
char *accion = "cortar";
//creo el puntero para pasarle la referencia de memoria (data) del struct pasado por parametro (la cual es un puntero).
struct parametro *mydata = data;
//llamo a la funcion imprimir le paso el struct y la accion de la funcion
imprimirAccion(mydata,accion);
//uso sleep para simular que que pasa tiempo
usleep( 20000 );
//doy la señal a la siguiente accion (cortar me habilita mezclar)
sem_post(&mydata->semaforos_param.sem_mezclar);
pthread_exit(NULL);
}
void* ejecutarReceta(void *i) {
//variables semaforos
sem_t sem_mezclar;
//crear variables semaforos aqui
//variables hilos
pthread_t p1;
//crear variables hilos aqui
//numero del equipo (casteo el puntero a un int)
int p = *((int *) i);
printf("Ejecutando equipo %d \n", p);
//reservo memoria para el struct
struct parametro *pthread_data = malloc(sizeof(struct parametro));
//seteo los valores al struct
//seteo numero de grupo
pthread_data->equipo_param = p;
//seteo semaforos
pthread_data->semaforos_param.sem_mezclar = sem_mezclar;
//setear demas semaforos al struct aqui
//seteo las acciones y los ingredientes (Faltan acciones e ingredientes) ¿Se ve hardcodeado no? ¿Les parece bien?
strcpy(pthread_data->pasos_param[0].accion, "cortar");
strcpy(pthread_data->pasos_param[0].ingredientes[0], "ajo");
strcpy(pthread_data->pasos_param[0].ingredientes[1], "perejil");
strcpy(pthread_data->pasos_param[1].accion, "mezclar");
strcpy(pthread_data->pasos_param[1].ingredientes[0], "ajo");
strcpy(pthread_data->pasos_param[1].ingredientes[1], "perejil");
strcpy(pthread_data->pasos_param[1].ingredientes[2], "huevo");
strcpy(pthread_data->pasos_param[1].ingredientes[3], "carne");
//inicializo los semaforos
sem_init(&(pthread_data->semaforos_param.sem_mezclar),0,0);
//inicializar demas semaforos aqui
//creo los hilos a todos les paso el struct creado (el mismo a todos los hilos) ya que todos comparten los semaforos
int rc;
rc = pthread_create(&p1, //identificador unico
NULL, //atributos del thread
cortar, //funcion a ejecutar
pthread_data); //parametros de la funcion a ejecutar, pasado por referencia
//crear demas hilos aqui
//join de todos los hilos
pthread_join (p1,NULL);
//crear join de demas hilos
//valido que el hilo se alla creado bien
if (rc){
printf("Error:unable to create thread, %d \n", rc);
exit(-1);
}
//destruccion de los semaforos
sem_destroy(&sem_mezclar);
//destruir demas semaforos
//salida del hilo
pthread_exit(NULL);
}
int main ()
{
//creo los nombres de los equipos
int rc;
int *equipoNombre1 =malloc(sizeof(*equipoNombre1));
int *equipoNombre2 =malloc(sizeof(*equipoNombre2));
//faltan equipos
*equipoNombre1 = 1;
*equipoNombre2 = 2;
//creo las variables los hilos de los equipos
pthread_t equipo1;
pthread_t equipo2;
//faltan hilos
//inicializo los hilos de los equipos
rc = pthread_create(&equipo1, //identificador unico
NULL, //atributos del thread
ejecutarReceta, //funcion a ejecutar
equipoNombre1);
rc = pthread_create(&equipo2, //identificador unico
NULL, //atributos del thread
ejecutarReceta, //funcion a ejecutar
equipoNombre2);
//faltn inicializaciones
if (rc){
printf("Error:unable to create thread, %d \n", rc);
exit(-1);
}
//join de todos los hilos
pthread_join (equipo1,NULL);
pthread_join (equipo2,NULL);
//.. faltan joins
pthread_exit(NULL);
}
//Para compilar: gcc subwayArgento.c -o ejecutable -lpthread
//Para ejecutar: ./ejecutable