C/Visual C - Ayuda con Threads

   
Vista:

Ayuda con Threads

Publicado por dc12 (4 intervenciones) el 17/05/2015 13:27:09
Hola tengo que realizar un programa que simule un carrerra de coches en la que
La carrera realizada por cada coche se simulará mediante la creación de un hilo que
ejecuta una funcion genérica (funcion_coches())Esta función simula la salida del coche de la
parrilla de salida y su llegada a la meta mediante sendos mensajes que se mostrarán en pantalla.
Para modelar la diferente evolución de cada coche en la carrera, se introduce un retardo aleatorio
en la finalización de la ejecución de la función.
La función asociada a los hilos recibe una estructura como argumento. Esta estructura está
formada por una cadena arbitraria y un entero (comprendido entre 0 y n_coches-1). Ambos datos
son utilizados conjuntamente durante la simulación para identificar cada coche.

1 # include <pthread .h>
2 # include <stdio .h>
3 # include <stdlib .h>
4 # include <string .h>
5 # define n_coches 8
67
// Array para los identificadores de los hilos
8 pthread_t tabla_hilos [ n_coches ];
9
10 // Tipo de datos hilos_param
11 typedef struct {
12 int id;
13 char * cadena ;
14 } hilos_param ;
15
16 // Array de datos de tipo hilos_param
17 hilos_param parametros [ n_coches ];
18
19 // Funcion ejecutada por los hilos
20 void * funcion_coches ( hilos_param *p)
21 {
22 int aleatorio ;
23 printf (" Salida %s %d\n", p-> cadena , p->id );
24
25 fflush ( stdout );
26 aleatorio = rand ();
27 sleep (1 + ( aleatorio %4));
28
29 printf (" Llegada %s %d\n", p-> cadena , p->id );
30
31
32 /* CODIGO 2 */
33
34
35 }
36
37 int main ( void )
38 {
39 int i, * res;
40
41 printf (" Inicio proceso de creacion de los hilos ...\ n");
42
43 // Se procede a crear los hilos
44
45 for (i =0; i< n_coches ; i ++)
46 {
47
48 /* CODIGO 1 */
49
50 }
51
52 printf (" Proceso de creacion de hilos terminado \n");
53 printf (" SALIDA DE COCHES \n");
54
55
56
57 for (i =0; i< n_coches ; i ++)
58 {
59
60 /* CODIGO 3 */
61
62 }
63
64 printf (" Todos los coches han LLEGADO A LA META \n");
65 return 0;
66 }



Soy muy novato en esto si me pudierais guiar como empezar y que tengo que usar , me ayudarías mucho

Gracias Risa tonta
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

Ayuda con Threads

Publicado por Tom (481 intervenciones) el 27/07/2015 16:09:16
1
gcc -std=c11 -pthread

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
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdbool.h>
#include <pthread.h>
 
struct CAR {
	int		number;
	char	name[32];
	pthread_t	thr;
};
 
pthread_mutex_t	semaphore = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t	green_light = PTHREAD_COND_INITIALIZER;
volatile bool	is_green = false;
 
/* */
void* racing_car(void *data) {
	struct CAR	*car_data = (struct CAR*)data;
	int			time_needed = (rand() % 6) + 5; // from 5 to 10 secs, bad random distribution
 
	pthread_mutex_lock(&semaphore);
	while(is_green == false) {
		pthread_cond_wait(&green_light, &semaphore);
	}
	pthread_mutex_unlock(&semaphore);
 
	printf("Car %s starts!\n", car_data->name);
	sleep(time_needed);
	printf("Car %s finishes after %d secs!\n", car_data->name, time_needed);
}
 
/* */
void create_race(int ncars) {
	struct CAR	cars[ncars];
 
	srand(time(NULL));
 
	for(int i = 0; i < ncars; i++) {
		cars[i].number = i + 1;
		sprintf(cars[i].name, "Car#%d", cars[i].number);
 
		pthread_create(&cars[i].thr, NULL, racing_car, &cars[i]);
	}
	pthread_mutex_lock(&semaphore);
	is_green = true;
	pthread_cond_broadcast(&green_light);
	pthread_mutex_unlock(&semaphore);
 
	for(int i = 0; i < ncars; i++) {
		pthread_join(cars[i].thr, NULL);
	}
}
 
/* */
int main(int argc, char *argv[]) {
	int	ncars = 10;
 
	if(argv[1]) {
		int tmp = atoi(argv[1]);
 
		if(tmp > 1 && tmp < 100) {
			ncars = tmp;
		}
	}
	create_race(ncars);
}
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