C/Visual C - Ayuda con threads

   
Vista:

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
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:Ayuda con threads

Publicado por Tom (481 intervenciones) el 19/02/2010 09:40:12
Hay una limitación (especificada claramente en la documentación) de pthread_exit(), y es que la variable retornada _no_ puede ser local (de stack) al thread.

Mira el ejemplo "Pthread Joining" en:

https://computing.llnl.gov/tutorials/pthreads/
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