• Sábado 14 de Diciembre de 2024, 10:59

Autor Tema:  Usar hilos pthreads en c++ para este caso  (Leído 2987 veces)

afrojene

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Usar hilos pthreads en c++ para este caso
« en: Martes 5 de Mayo de 2009, 13:38 »
0
Hola, estoy realizando un programa que busca puntos característicos en imágenes y luego busca las correspondencias entre ambas.
El caso es que quiero aumentar la velocidad de ejecución y para ello necesito utilizar hilos pero no se como pasar los atributos ni nada!
Lo que intento hacer es lanzar la busqueda de puntos caracteristicos de cada imagen cada una en un hilo.
Aqui les dejo el proceso sin hilos:
Código:
Código: C++
  1.  
  2. Procesado P;                      //Declaración de un objeto donde
  3.                                   //estan las funciones de busqueda
  4.  
  5. Image* ImLeft, ImRight;           //Declaracion de Imagenes
  6.  
  7. vector<double> ptsLeft, ptsRight; //Vectores donde almacenar los puntos
  8.  
  9. P.getPoints(ImLeft, ptsLeft);     //Funciones de busqueda que quiero
  10. P.getPoints(ImrRight, ptsRight);  //lanzar cada una en un hilo
  11.  
  12.  
La función getPoints():
Código:
Código: C++
  1.  
  2. void getPoints(Image* Im, vector<double> &pts);
  3.  
  4.  

Por favor si alguien entiende de hilos pthreads y sepa como lanzar las funciones pasando los parametros que me heche una mano porque yo no lo consigo!!
Muchas gracias Question

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #1 en: Martes 5 de Mayo de 2009, 13:50 »
0
¿Cómo lo haces para que no te funcione con hilos?

afrojene

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #2 en: Martes 5 de Mayo de 2009, 15:42 »
0
Hola, gracias por contestar. No me funciona porque no se como puedo pasar los parámetros a las funciones a través de los hilos..
Sabrias explicarme como debo hacer??
Muchas gracias

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #3 en: Martes 5 de Mayo de 2009, 16:37 »
0
si no me equivoco , al generar los hilos tienes un parametro de tipo void* que se le va a pasar al hilo.
Entonces te preparas una estructura o buffer y se lo pasas en ese parametro.

Código: C++
  1.  
  2. pthread_create(&hilo0, NULL, (void *) &mis_datos_parametro, (void *) &id0);
  3.  
  4.  

yo suelo usar el _beginthread de windows entonces no se exactamente si funcionan igual , pero por lo que he ojeado por internet es parecido.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #4 en: Martes 5 de Mayo de 2009, 16:41 »
0
Primero, especificarte que a un hilo POSIX sólo le puedes pasar un argumento, así que la función getPoints() deberá llamarse desde otra que será la principal del hilo.

Para crear un hilo, debes usar pthread_create(), cuyo prototipo es

Código: Text
  1. int pthread_create(pthread_t *restrict thread,
  2.               const pthread_attr_t *restrict attr,
  3.               void *(*start_routine)(void*), void *restrict arg);
  4.  
La función devuelve 0 si el hilo se creó correctamente. En cuanto a los argumentos, thread es un valor de vuelta con el ID del hilo creado, attr son los atributos del hilo a crear (puedes pasar NULL para usar los atributos por defecto), start_routine es la función de entrada del hilo y arg el argumento único que recibe la función de entrada del hilo.

https://computing.llnl.gov/tutorials/pthreads/

afrojene

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #5 en: Martes 5 de Mayo de 2009, 16:52 »
0
Es decir tendria que meter los datos en una estructura y pasar dicha estructura como argumento al hilo??

La estructura con mis parámetros me quedaría así:
Código: C++
  1.  
  2. struct{
  3.      Image* ImLeft, ImRight;  
  4.      vector<double> ptsLeft, ptsRight;
  5. }Parametros;
  6.  
  7.  

Y ahora crearía el hilo asi:

Código: C++
  1.  
  2. pthread_t hilo;
  3. pthread_create(&hilo, NULL, (void *) &P.getPoints, (void *) &Parametros);
  4.  
  5.  

Siendo ahora la funcion getPoints:
Código: C++
  1.  
  2. void getPoints(void *arg);
  3.  
  4.  

Asi estaría bien????
Muchas gracias

afrojene

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #6 en: Martes 5 de Mayo de 2009, 17:17 »
0
Muchas gracias por la info  m0skit0, doy por supesto que lo que he puesto antes esta mal, entonces deberia crear una funcion desde la que llamar a getPoints(), por ejemplo:
Código: C++
  1.  
  2. void *Hilo(void *param)
  3. {
  4.    Procesado P;
  5.    P.getPoints(param->ImLeft, param->ptsLeft);
  6.    pthread_exit(NULL);
  7. }
  8.  
  9.  
Y ahora comenzaría el hilo así:
Código: C++
  1.  
  2. pthread_t hilo;
  3. pthread_create(&hilo, NULL, Hilo, (void *) &Parametros);
  4.  
  5.  
Que os parece??

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #7 en: Martes 5 de Mayo de 2009, 17:36 »
0
Cita de: "afrojene"
doy por supesto que lo que he puesto antes esta mal
Hombre, mal no está puesto que has cambiado los argumentos que recibe la función. Aunque la segunda forma está mejor porque así no modificas el código que ya tienes hecho, sólo añades otra función  ;)

Cita de: "afrojene"
P.getPoints(param->ImLeft, param->ptsLeft);
Aquí me parece que vas a tener que hacer un cast, porque param es void *.

Aparte de esto, parece válido.

afrojene

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #8 en: Martes 5 de Mayo de 2009, 23:42 »
0
OK, mañana cuando esté en la universidad lo probaré y os cuento.
Por cierto me puedes decir como se haría el cast de void* ese que me comentas??
Gracias

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #9 en: Miércoles 6 de Mayo de 2009, 09:36 »
0
Cita de: "afrojene"
Por cierto me puedes decir como se haría el cast de void* ese que me comentas??
Pues te cuento, cuando tienes un tipo de dato y quieres hacerlo pasar por otro, se hace Casting. En este caso, si tienes un dato en forma de estructura

Código: C++
  1. MIESTRUCTURA * miST;
  2.  

si quisieras pasar como parametro void* a miST el compilador te diria algo tal que:

cannot convert or there is no suitable conversion from MIESTRUCTURA * to void *.

para pasarlo como parametro tendrias que hacer una conversion a tipo de dato (void*).
Para ello coges el puntero y le especificas el casting escribiendo el tipo de  al que lo quieres pasar entre parentesis, por ejemplo (void *).
Código: C++
  1.  
  2. void * v=(void*)miST;
  3.  
  4.  

entonces en v tendrias un puntero de tipo (void *).

ahora bien, una vez lo has pasado como parametro, en la funcion desconoces el antiguo tipo de dato del parametro con lo que no puedes interpretarlo como estructura, a no ser que vuelvas a hacer un casting.

Código: C++
  1.  
  2. ((MIESTRUCTURA*)v)->Campo_de_la_estructura
  3.  
  4.  
:good:

afrojene

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #10 en: Miércoles 6 de Mayo de 2009, 10:54 »
0
OK me ha quedado muy claro,  muchas gracias, esque nunca habia trabajado con void* creia que era solo para las funciones! jeje.
De todas formas muchisimas gracias por ayudar!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Usar hilos pthreads en c++ para este caso
« Respuesta #11 en: Miércoles 6 de Mayo de 2009, 11:37 »
0
Cita de: "diego.martinez"
para pasarlo como parametro tendrias que hacer una conversion a tipo de dato (void*).
Cita de: "diego.martinez"
cuando tienes un tipo de dato y quieres hacerlo pasar por otro, se hace Casting.
No es exactamente así.

El "casting" es para obligar al compilador a aceptar cierta expresión en la que no coinciden los datos. No se hace ninguna conversión, sino simplemente forzar al compilador a ignorar que los datos son diferentes. Esto se debe hacer con cuidado y siempre estando seguro de lo que se está haciendo es correcto, porque puede dar lugar a fallos muy díficles de corregir después.

Saludos y me alegro de que nuestra ayuda te haya sido útil.