Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: snake_linux en 27 Agosto 2015, 13:19 pm



Título: Ayuda con hilos en C
Publicado por: snake_linux en 27 Agosto 2015, 13:19 pm
Hola a tod@s, ahora estoy aprendiendo a manejar lo básico de los hilos en C, resulta que tengo este código:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <malloc.h>
  4. #include <pthread.h>
  5.  
  6. void * funcion(void *);
  7.  
  8. int main()
  9. {
  10.  
  11. pthread_t idhilo;
  12.  int a=5;
  13. pthread_create(&idhilo, NULL, funcion, &a);
  14. // pthread_join(idhilo, NULL);
  15.  int y;
  16.  for(y=0;y<5;y++) printf("hilo principal\n");
  17.  
  18.  
  19.  
  20. }
  21.  
  22. void * funcion(void * a) {
  23.  
  24.  int x;
  25.  for(x=0;x<5;x++) printf("Se está ejecutando el hilo\n");
  26.  
  27.  
  28. }

Si descomento la linea 14, se ejecuta el hilo y el hilo principal se queda en segundo plano, si está comentada el hilo no llega a ejecutarse, en teoría, por lo que he leido pthread_join() sirve para mantener el hilo padre en espera hasta que el hilo hijo termine su ejecución, pero yo lo que quiero es que se ejecuten los dos hilos a la vez, ya que creo que eso es la finalidad de usar hilos.

Gracias de antemano.

Saludos.


Título: Re: Ayuda con hilos en C
Publicado por: ivancea96 en 27 Agosto 2015, 13:39 pm
Join hace lo que dices, esperar a que acabe el hilo. Si no lo pones, no espera.


Título: Re: Ayuda con hilos en C
Publicado por: snake_linux en 27 Agosto 2015, 13:52 pm
Join hace lo que dices, esperar a que acabe el hilo. Si no lo pones, no espera.

Ya, no espera, pero se supone que si no usas join, ¿ se ejecutarían a la vez no?, es que si comento el join, el hilo ni siquiera llega a ejecutarse.


Título: Re: Ayuda con hilos en C
Publicado por: ivancea96 en 27 Agosto 2015, 14:36 pm
Con el join comentado, funciona correctamente.


Título: Re: Ayuda con hilos en C
Publicado por: snake_linux en 27 Agosto 2015, 15:13 pm
Con el join comentado, funciona correctamente.

Compilar compila, y también arranca, pero no se ejecuta el for con el printf del hilo hijo, lo compilo con:

gcc pruebas.c -o pruebas -lpthread



Título: Re: Ayuda con hilos en C
Publicado por: ivancea96 en 27 Agosto 2015, 15:18 pm
El for se ejecuta correctamente.

Coloca el join al final del hilo principal para evitar que se cierre el programa con el hilo abierto.


Título: Re: Ayuda con hilos en C
Publicado por: snake_linux en 27 Agosto 2015, 15:33 pm
El for se ejecuta correctamente.

Coloca el join al final del hilo principal para evitar que se cierre el programa con el hilo abierto.

A lo que me refiero, es que comentando el join, es decir, teniendo este código:

Código
  1. #include <stdio.h>
  2.    #include <string.h>
  3.    #include <malloc.h>
  4.    #include <pthread.h>
  5.  
  6.    void * funcion(void *);
  7.  
  8.    int main()
  9.    {
  10.  
  11.    pthread_t idhilo;
  12.      int a=5;
  13.    pthread_create(&idhilo, NULL, funcion, &a);
  14.      int y;
  15.      for(y=0;y<5;y++) printf("hilo principal\n");
  16.  
  17.    }
  18.  
  19.    void * funcion(void * a) {
  20.  
  21.      int x;
  22.      for(x=0;x<5;x++) printf("Se está ejecutando el hilo\n");
  23.  
  24.  
  25.    }

La salida que me genera es:

hilo principal
hilo principal
hilo principal
hilo principal
hilo principal

Cuando debería ser:

hilo principal
se está ejecutando el hilo
hilo principal
se está ejecutando el hilo
....

Ya que en teoria los threads sirven para tener dos hilos de ejecución al mismo tiempo, si no, no le veo la diferencia entre esto y llamar a una función.


Título: Re: Ayuda con hilos en C
Publicado por: kondrag_X1 en 27 Agosto 2015, 15:48 pm
a ver no soy un esperto y alojemos digo una tontería pero no creo que eso sea así:

ami entender seria:
Código:
hilo principal
hilo principal
hilo principal
hilo secundario
hilo principal
hilo principal
hilo secundario

porque si el hilo secundario intenta acceder al recurso que esta utilizan el hilo principal en ese momento no va a poder.

no se si me explico, con claridad.


Título: Re: Ayuda con hilos en C
Publicado por: snake_linux en 27 Agosto 2015, 15:54 pm
a ver no soy un esperto y alojemos digo una tontería pero no creo que eso sea así:

ami entender seria:
Código:
hilo principal
hilo principal
hilo principal
hilo secundario
hilo principal
hilo principal
hilo secundario

porque si el hilo secundario intenta acceder al recurso que esta utilizan el hilo principal en ese momento no va a poder.

no se si me explico, con claridad.


¿ Entonces es por eso ? Por que con printf intentan acceder ambos a la vez a stdout ?


Título: Re: Ayuda con hilos en C
Publicado por: ivancea96 en 27 Agosto 2015, 16:01 pm
Lo peor que podría pasar es que se mezclasen las salidas.

Pon el join al final del main, y mira si la salida es igual.

En caso de que la salida siga siendo incorrecta, comprueba si el thread se ejecuta.


Título: Re: Ayuda con hilos en C
Publicado por: snake_linux en 27 Agosto 2015, 16:08 pm
Lo peor que podría pasar es que se mezclasen las salidas.

Pon el join al final del main, y mira si la salida es igual.

En caso de que la salida siga siendo incorrecta, comprueba si el thread se ejecuta.

He modificado un poco el código y al final se ha quedado así:

Código
  1.    #include <stdio.h>
  2.    #include <string.h>
  3.    #include <malloc.h>
  4.    #include <pthread.h>
  5.  
  6.    void * funcion(void *);
  7.     int b=0;
  8.    int main()
  9.    {
  10.  
  11.    pthread_t idhilo;
  12.      int a=5;
  13.    pthread_create(&idhilo, NULL, funcion, &a);
  14.      int y;
  15.      for(y=0;y<5;y++) printf("hilo principal\n");
  16.     printf("b vale %d", b);
  17.     pthread_join(idhilo, NULL);
  18.    }
  19.  
  20.    void * funcion(void * a) {
  21.  
  22.      b=5;
  23.  
  24.  
  25.    }

Y el valor de b me da 0, por lo que no se ejecuta el hilo hijo hasta que no llega al join...


Título: Re: Ayuda con hilos en C
Publicado por: ivancea96 en 27 Agosto 2015, 18:14 pm
Coloca un sleep(1) en el main para ver si el thread llega a ejecutarse antes del join.


Título: Re: Ayuda con hilos en C
Publicado por: snake_linux en 27 Agosto 2015, 20:42 pm
Coloca un sleep(1) en el main para ver si el thread llega a ejecutarse antes del join.

He hecho lo que me has dicho:

Código
  1.    #include <stdio.h>
  2.    #include <string.h>
  3.    #include <malloc.h>
  4.    #include <pthread.h>
  5. #include <unistd.h>
  6.  
  7.    void * funcion(void *);
  8.     int b=0;
  9.    int main()
  10.    {
  11.  
  12.    pthread_t idhilo;
  13.      int a=5;
  14.    pthread_create(&idhilo, NULL, funcion, &a);
  15.      int y;
  16.      for(y=0;y<5;y++) printf("hilo principal\n");
  17.      sleep(1);
  18.     printf("b vale %d", b);
  19.     pthread_join(idhilo, NULL);
  20.    }
  21.  
  22.    void * funcion(void * a) {
  23.  
  24.      b=5;
  25.  
  26.  
  27.    }

El caso es que funciona, pero sigo sin entenderlo, ¿ Por que hay que hacer un segundo de pausa para que se ejecute el hilo ?.

Saludos.


Título: Re: Ayuda con hilos en C
Publicado por: ivancea96 en 27 Agosto 2015, 21:10 pm
Los diferentes hilos no tienen por qué ir coordinados. Si el main acaba antes que los otros threads, los otros threads se acaban al momento.


Título: Re: Ayuda con hilos en C
Publicado por: snake_linux en 28 Agosto 2015, 00:06 am
Los diferentes hilos no tienen por qué ir coordinados. Si el main acaba antes que los otros threads, los otros threads se acaban al momento.

Vale muchas gracias, ya me ha quedado claro.