Mostrando las entradas con la etiqueta Hilos. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Hilos. Mostrar todas las entradas

miércoles, 30 de marzo de 2016

Thread en lenguaje C sobre entorno linux - Creación de un hilo

Thread Creation - Creación de un hilo
Cada hilo en un proceso se identifica mediante un ID de hilo. Cuando se hace referencia a los ID de hebra en los programas de C o C ++, se utiliza el tipo pthread_t.

Tras su creación, cada hilo realiza una función.Este es sólo una función ordinaria y contiene el código que el hilo debe ejecutar. Cuando la función devuelve, el hilo termina. En GNU / Linux, las funciones de hilos toman un único parámetro, de tipo void*, y tienen un tipo de retorno void *.


El parámetro es el argumento de hilo:
GNU / Linux pasa el valor a lo largo del hilo sin mirarlo.Su programa puede utilizar este parámetro para pasar los datos a un nuevo hilo. Del mismo modo, el programa puede utilizar el valor de retorno de pasar los datos a partir de un tema existente de vuelta a su creador.

La función pthread_create crea un nuevo hilo.Y usted le proporciona lo siguiente:
  1. Un puntero a una variable pthread_t, en el que el ID del hilo del nuevo hilo es almacenado. 
  2. Un puntero a un objeto de atributo hilo.Este objeto controla los detalles de cómo el hilo interactúa con el resto del programa. Si pasa NULL como el atributo de hilo, un hilo se creará con los atributos de hilo por defecto.Esto se discutiría mas adelante. 
  3. Un puntero a la función del hilo. Este es un puntero de función ordinaria, de este tipo:    void* (*) (void*)
  4. Un valor del argumento de hilo de tipo void *. Este pasa simplemente como argumento a la función del hilo cuando el hilo comienza a ejecutar.
Una llamada a pthread_create retorna inmediatamente, y el hilo original continúa ejecutando las instrucciones después de la llamada. Mientras tanto, el nuevo hilo comienza a ejecutar la función del hilo. Y los horarios de los dos hilos de Linux trabajan de forma asíncrona, y su programa no deben confiar en el orden relativo en el que las instrucciones se ejecutan en los dos hilos.
El siguiente programa crea un hilo que imprime x de forma continua en el error estándar. Después de llamar a pthread_create, el hilo principal o imprime de forma continua en el error estándar.

 Ejemplo:
#include <pthread.h>
#include <stdio.h>
/* Imprime x como salida de error. El parámetro no se utiliza. No retorna. */
void* print_xs (void* unused)
{
while (1)
fputc ('x', stderr);
return NULL;
}
/* El inicio del programa */
int main ()
{
pthread_t thread_id;
/* Crea un nuevo Hilo. El nuevo hilo se ejecutará la función print_xs. */
pthread_create (&thread_id, NULL, &print_xs, NULL);
/* Imprimir de forma continua 'o' como salida estándar de errores. */
while (1)
fputc ('o', stderr);
return 0;
}
compilar y enlazar este programa mediante el siguiente codigo:
gcc nombre.c -o nombre -lpthread

intente ejecutarlo para que pasa. Observe el patron impredecible de las x's y las o's como linux alterna horarios de los hilos. 

En circunstancias normales, un hilo sale de una de dos maneras. Una forma, como se ilustra anteriormente, es mediante la devolución de la función del hilo. 
El valor de retorno de la función del hilo se toma como el valor de retorno del hilo. Alternativamente, un hilo puede salir de forma explícita llamando pthread_exit.
Esta función puede ser llamado desde dentro de la función del hilo o de alguna otra función de llamada directa o indirectamente por la función de hilo.El argumento para pthread_exit es el valor de retorno hilo.

Thread en lenguaje C sobre entorno linux - introduccion

PTHREAD
HILOS, por ejemplo los procesos, son un mecanismo para permitir que un programa pueda hacer más de una cosa a la vez. Al igual que con los procesos, subprocesos parecen funcionar simultáneamente;El kernel de Linux es el que planifica de forma asíncrona, interrumpiendo cada hilo de vez en cuando para dar a otros la oportunidad de ejecutarse.

Conceptualmente, existe un hilo dentro de un proceso. Los hilos son una unidad de grano más fino de la ejecución de procesos. Cuando se invoca un programa, Linux crea un nuevo proceso y en ese proceso crea un solo hilo, que ejecuta el programa de forma secuencial. Ese hilo puede crear hilos adicionales; todos los hilos se ejecutan en el mismo programa y en el mismo proceso, pero cada hilo puede ser la ejecución de una parte diferente del programa en cualquier tiempo dado.
Se a visto cómo un programa puede bifurcar un proceso hijo. El proceso hijo que inicialmente ejecuta el programa de su padre, con la memoria virtual de su padre, los descriptores de archivo, etc.
"En copiado". El proceso hijo puede modificar su memoria, cierre de los descriptores de fichero, y similares sin afectar a su padre, y viceversa. Cuando un programa crea otro hilo, nada se copia. La creación y el hilo creado comparten el mismo espacio de memoria, los descriptores de archivos y otros recursos del sistema que el original.
Si cambiamos de un hilo, el valor de una variable, por ejemplo, el otro hilo posteriormente verá el valor modificado. Del mismo modo, si un hilo cierra un descriptor de archivo, otros hilos no pueden leer o escribir en el descriptor de archivo. Debido a un proceso y todos sus hilos pueden ser ejecutando sólo un programa a la vez, si cualquier hilo dentro de un proceso de llama uno de las funciones exec , todos los otros hilos se terminaron (el nuevo programa puede, por supuesto, crear una nuevo hilo). 
GNU / Linux implementa la API de hilos POSIX estándar (conocido como pthreads). Todas funciones de hilo y tipos de datos se declaran en el archivo de cabecera <pthread.h> .Las funciones del pthread no están incluidos en la biblioteca estándar C. En su lugar, están en libpthread, lo que debería agregar -lpthread a la línea de comandos cuando se vincula a su programa.