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


blog comments powered by Disqus