Introducción a los hilos con la librería glib

Esta receta prentede ser una introducción a los hilos utilizando la librería glib.

¿Qué es un hilo?

Un hilo de ejecución es una característica que permite a una aplicación realizar varias tareas concurrentemente. Los distintos hilos de ejecución comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situación de autenticación, etc. Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente, por ejemplo si programamos videojuegos podemos tener un hilo para la Inteligencia Artificial, otro para la física y otro para el renderizado de los gráficos, pero todos ellos se ejecutarán de manera paralela.

¿Qué es glib?

La librería glib es una de las más importantes que existen en GNOME. Dentro de glib está implementada una serie de tipos de datos que nos hace más fácil, si cabe, el tratamiento de los datos y además tiene la propiedad de mejorar la portabilidad de nuestros programas.

Un ejemplo sencillo de programa en C++ que crea dos hilos

#include <cstdlib>
#include <iostream>
#include <glib.h>
 
GThreadFunc funcion_de_prueba(char *cadena);
 
int main(int argc, char *argv[])
{
  char *mensaje1 = "mensaje_1";
  char *mensaje2 = "mensaje_2";
 
  //inicializamos el soporte para hilos en glib
  if (!g_thread_supported ()) g_thread_init (NULL);
 
  //reservamos memoria para los hilos de manera dinámica
  GThread *productor = (GThread *) malloc(sizeof(GThread));
  GThread *consumidor = (GThread *) malloc(sizeof(GThread));
 
  //creamos los hilos
  productor = g_thread_create( (GThreadFunc)funcion_de_prueba,(char *)mensaje1 ,TRUE,NULL);
  consumidor = g_thread_create( (GThreadFunc)funcion_de_prueba, (char *)mensaje2 ,TRUE,NULL);
 
  //destruimos los hilos
  g_thread_join(productor);
  g_thread_join(consumidor);
 
  //liberamos memoria
  free(productor);
  free(consumidor);
 
  return 0;
}
 
 
//esta es la función que es llamada por los hilos
GThreadFunc funcion_de_prueba(char *cadena){ 
  printf("esta es la funcion de prueba\n");
  printf("mensaje  %s\n", cadena);
}

Resultados que deberás obtener

esta es la funcion de prueba
mensaje mensaje_1
esta es la funcion de prueba
mensaje mensaje_2

o bien
esta es la funcion de prueba
esta es la funcion de prueba
mensaje mensaje_1
mensaje mensaje_2

Referencias

Manual de glib
Documentos glib
Blog de greenbite

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de david.villa

Según...

el manual de referencia de Glib, al invocar la función g_thread_join():

[…] All resources of thread including the GThread struct are released. […]

Yo diría que los free() y sobre todo los malloc() sobran.

No soy portavoz de ningún colectivo, grupo o facción. Mi opinión es personal e intransferible.