systemadmin.es > Programación > Funcionamiento de pthreads

Funcionamiento de pthreads

Tradicionalmente mediante la llamada fork() podemos crear procesos hijos que es una segunda cópia del primero pero que devuelve un valor diferente de fork() por lo que se pueden diferenciar. Vamos a ver un ejemplo utilizando pthreads en lugar de fork()

En el caso de pthreads al crear el thread deberemos indicar la función a ejecutar (debe devolver void* y tener como argumento void*):

int 
pthread_create (pthread_t *thread_id, const pthread_attr_t *attributes,
                void *(*thread_function)(void *), void *arguments);

El thread termina al finalizar la función o al llamar a la función pthread_exit:

int
pthread_exit (void *status);

Y mediante pthread_join podemos esperar la ejecución de un thread:

int
pthread_join (pthread_t thread, void **status_ptr);

Vamos a ver un ejemplo:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *hello_world_threads(void *m);

main()
{
     pthread_t thread1, thread2;
     char *txt1="thread1";
     char *txt2="thread2";

     pthread_create(&thread1, NULL, hello_world_threads, (void*) txt1);
     pthread_create(&thread2, NULL, hello_world_threads, (void*) txt2);

     pthread_join(thread1, NULL);
     pthread_join(thread2, NULL); 

     exit(0);
}

void * hello_world_threads(void *m)
{
     printf("%s \n", (char *)m);

     return NULL;
}

Lo compilamos con:

$ gcc -pthread demo.c

Si los ejecutamos veremos que se ejecutan en cualquier orden respecto a su “thread hermano“:

threads hermanos

threads hermanos

Lo podemos apreciar fácilmente:

$ ./a.out 
thread2 
thread1 
$ ./a.out 
thread1 
thread2 
$ ./a.out 
thread2 
thread1 

One comment to “Funcionamiento de pthreads”

  1. Interesante.

    Tengo una duda y no se si tu la tienes clara y me puedes ayudar.

    Siempre he sabido que existe relación de padres e hijos entre procesos pero ¿ y entre hilos ? ¿ existen hilos hijos de otros ?
    Creo que cuando un hilo crea otro hilo se convierte en hermano, en tanto en cuanto comparten proceso pero no se mantiene información padre-hijo entre ambos

    ¿ estoy en lo cierto o equivocado ?

    Un saludo

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>