Acerca de Hilos en C


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 o 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í o 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.id = i;
parametros.valor=rand()%100;
pthread_create(&tabla_hilos, NULL, (void *)&funcion_thread,(void *)¶metros);
}
// 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,&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;
}
//-------------------------------------------------------------------------------------------------
(
Respuesta
1
Si no te entiendo mal, dices que tu código no continúa hasta que todos los hilos termina... pues bien, es que es precisamente eso lo que estás diciendo con pthread_join. Dicha función no retorna hasta que el hilo que se indica no termina... es lógico, puesto que no tendría sentido que terminase el hilo principal (tu main) sin haber terminado los otros. De todos modos y aunque nunca usé la librería pthread, creo que tienes varios errores en ese código:
- El primer parámetro de pthread_create es un puntero a la estructura pthread_t donde decará los datos del thread. En tu caso siempre le pasas "&tabla_hijos", por lo que estás creando todos los threads sobre la misma estructura pthread, que es la primera de dicho array. Deberías hacer algo como:
 for( i = 0 ; i < MAX_THREADS; i++ )
   pthread_create( &(tabla_hijos),....)
- Lo mismo en el bucle donde haces pthread_join

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas