Ayuda con threads
Publicado por Gustavo (1 intervención) el 19/02/2010 03:32:52
Hola, necesito algo de ayuda, hice el siguiente programa para aprender a trabajar con hilos y de hecho los hilos trabajan bien, el problema es a la hora de usar pthread_exit para devolver el resultado de cada hilo y pthread_join para recibirlo, cada hilo calcula un float, y este se imprime desde el cuerpo del thread justo antes de cada pthread_exit, despues en el main se hace pthread_join a cada hilo y se imprimen los datos obtenidos pero los datos una vez obtenidos son erroneos, todos tienen valores 0.0000000algo... he intentado varias cosas y no logro conseguir los datos de forma correcta... a ver si alguien me puede decir que estoy ahciendo mal.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 100
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
//definimos la estructura para pasarle los datos a la funcion prueba
typedef struct
{
float a;
float b;
}datos;
void *prueba(void * dato)
{
datos *entrada;
entrada=(datos*) dato;
pthread_mutex_lock(&mutex);
float a=(float) entrada->a;
float b=(float) entrada->b;
entrada->a=entrada->a+1;
entrada->b=entrada->b+1;
pthread_mutex_unlock(&mutex);
float XI;
XI=a+b;
printf("de %f a %f dio %f\n",a,b,XI);
pthread_exit(&XI);
}
int main()
{
datos pass;
int creo;
int i;
pass.a=0;
pass.b=1;
pthread_t threads[10];
for(i=0;i<10;i++)
{
if(creo=pthread_create(&threads[i],NULL,prueba,(void*)&pass))
{
printf("HA OCURRIDO UN ERROR");
exit(-1);
}
}
for(i=0;i<10;i++)
{
float *l;
pthread_join(threads[i],(void**)&l);
printf("termino el %davo hilo con resultado %f\n",1+i,*l);
}
}
ejemplo de corrida
de 0.000000 a 1.000000 dio 1.000000
de 4.000000 a 5.000000 dio 9.000000
de 1.000000 a 2.000000 dio 3.000000
de 2.000000 a 3.000000 dio 5.000000
de 3.000000 a 4.000000 dio 7.000000
de 5.000000 a 6.000000 dio 11.000000
de 6.000000 a 7.000000 dio 13.000000
de 7.000000 a 8.000000 dio 15.000000
de 8.000000 a 9.000000 dio 17.000000
de 9.000000 a 10.000000 dio 19.000000
termino el 1avo hilo con resultado -0.000014
termino el 2avo hilo con resultado -0.000014
termino el 3avo hilo con resultado -0.000014
termino el 4avo hilo con resultado -0.000014
termino el 5avo hilo con resultado -0.000014
termino el 6avo hilo con resultado -0.000014
termino el 7avo hilo con resultado -0.000014
termino el 8avo hilo con resultado -0.000014
termino el 9avo hilo con resultado -0.000014
termino el 10avo hilo con resultado -0.000014
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 100
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
//definimos la estructura para pasarle los datos a la funcion prueba
typedef struct
{
float a;
float b;
}datos;
void *prueba(void * dato)
{
datos *entrada;
entrada=(datos*) dato;
pthread_mutex_lock(&mutex);
float a=(float) entrada->a;
float b=(float) entrada->b;
entrada->a=entrada->a+1;
entrada->b=entrada->b+1;
pthread_mutex_unlock(&mutex);
float XI;
XI=a+b;
printf("de %f a %f dio %f\n",a,b,XI);
pthread_exit(&XI);
}
int main()
{
datos pass;
int creo;
int i;
pass.a=0;
pass.b=1;
pthread_t threads[10];
for(i=0;i<10;i++)
{
if(creo=pthread_create(&threads[i],NULL,prueba,(void*)&pass))
{
printf("HA OCURRIDO UN ERROR");
exit(-1);
}
}
for(i=0;i<10;i++)
{
float *l;
pthread_join(threads[i],(void**)&l);
printf("termino el %davo hilo con resultado %f\n",1+i,*l);
}
}
ejemplo de corrida
de 0.000000 a 1.000000 dio 1.000000
de 4.000000 a 5.000000 dio 9.000000
de 1.000000 a 2.000000 dio 3.000000
de 2.000000 a 3.000000 dio 5.000000
de 3.000000 a 4.000000 dio 7.000000
de 5.000000 a 6.000000 dio 11.000000
de 6.000000 a 7.000000 dio 13.000000
de 7.000000 a 8.000000 dio 15.000000
de 8.000000 a 9.000000 dio 17.000000
de 9.000000 a 10.000000 dio 19.000000
termino el 1avo hilo con resultado -0.000014
termino el 2avo hilo con resultado -0.000014
termino el 3avo hilo con resultado -0.000014
termino el 4avo hilo con resultado -0.000014
termino el 5avo hilo con resultado -0.000014
termino el 6avo hilo con resultado -0.000014
termino el 7avo hilo con resultado -0.000014
termino el 8avo hilo con resultado -0.000014
termino el 9avo hilo con resultado -0.000014
termino el 10avo hilo con resultado -0.000014
Valora esta pregunta
0