C/Visual C - Duda con Hilos en C

 
Vista:

Duda con Hilos en C

Publicado por novato (1 intervención) el 23/11/2009 20:02:52
Hola a Todos:

Mi nombre es Jorge y soy me dedico al desarrollo de aplicaciones informáticas para la industria. Hasta ahora nunca he trabajado con hilos y me han encargado una aplicación en la que necesito utilizarlos.

Por lo que he entendido, programar con hilos ó implementar hilos en el código de desarrollo de una aplicación sirve para poder simultaneizar tareas compartiendo la misma memoria que la tarea principal que desencadena dichos hilos.

Pues bien, si esto no lo he entendido mal, he estado realizando pruebas y no es así ó por lo menos yo no he conseguido hacer esto.

Adjunto el código con el que estoy probando, pero no funciona de forma simultanea, es decir la tarea principal lanza todos los hilos correctamente, pero dicha tarea principal no continua hasta que todos los hilos terminan:

//-------------------------------------------------------------------------------------------------
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_THREADS 8

typedef struct {
int id,valor;
} parameters;

parameters parametros[MAX_THREADS];
pthread_t tabla_hilos[MAX_THREADS];

void *funcion_thread(parameters *p) {
printf("Ejecutando la función en el thread con id %d al que se le ha pasado el valor %d\n", p->id,p->valor);
pthread_exit(p->valor);
}

int main(void){
int i, *res;

//creamos tantos threads como MAX_THREADS
printf("\nCreando threads...\n\n");
for (i=0; i<MAX_THREADS; i++) {
parametros[i].id = i;
parametros[i].valor=rand()%100;

pthread_create(&tabla_hilos[i], NULL, (void *)&funcion_thread,(void *)¶metros[i]);
}

// esperamos que terminen todos los threads
printf("\nThreads creados. Esperando que terminen...\n\n");
for (i=0; i<MAX_THREADS; i++) {
int *aux;
pthread_join(tabla_hilos[i],&aux);
printf("El thread %d devolvio el valor %d\n", i,aux);
}



//Texto de depuración
** ( ESTE TEXTO NO SE IMPRIME HASTA QUE TODOS LOS HILOS FINALIZAN ) **
printf("Esperamos a que finalizen los Hilos . . .");


return 0;
}

//-------------------------------------------------------------------------------------------------

¿ Alguien me podría ayudar ?
( Espero haberme explicado con claridad ? )

Muchas Gracias y Saludos Cordiales !!
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

RE:Duda con Hilos en C

Publicado por Tom (619 intervenciones) el 24/11/2009 10:12:51
Creo que tienes líos de punteros. Tu programa original da SIGSEGV.
Este funciona correctamente, compara el código:


#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_THREADS 8

typedef struct {
int id,valor;
} parameters;

parameters parametros[MAX_THREADS];
pthread_t tabla_hilos[MAX_THREADS];

void *funcion_thread(void *par) {
parameters *p = (parameters *)par;
printf("Ejecutando la función en el thread con id %d al que se le ha pasado el valor %d\n", p->id, p->valor);
pthread_exit(&p->valor);
}

int main(void){
int i, *res;

//creamos tantos threads como MAX_THREADS
printf("\nCreando threads...\n\n");
for(i=0; i<MAX_THREADS; i++) {
parametros[i].id = i;
parametros[i].valor = rand() % 100;

pthread_create(&tabla_hilos[i], NULL, &funcion_thread, ¶metros[i]);
}

// esperamos que terminen todos los threads
printf("\nThreads creados. Esperando que terminen...\n\n");
for(i=0; i<MAX_THREADS; i++) {
int aux;
int *aaux = &aux;

pthread_join(tabla_hilos[i], (void **)&aaux);
printf("El thread %d devolvio el valor %d\n", i,aux);
}

//Texto de depuración
//** ( ESTE TEXTO NO SE IMPRIME HASTA QUE TODOS LOS HILOS FINALIZAN ) **
printf("Esperamos a que finalizen los Hilos . . .");

return 0;
}
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

RE:Duda con Hilos en C

Publicado por novato (1 intervención) el 25/11/2009 08:59:04
Hola !!

Creo que con esto me sirve.
Voy a analizar el codigo que me has mandado para ver cual es el error que tengo yo.

Gracias y Saludos !!!
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