Hilos POSIX

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 10 de abril de 2021; las comprobaciones requieren 11 ediciones .

POSIX Threads  es el estándar POSIX para implementar hilos (threads) de ejecución . El estándar POSIX.1c, extensiones de subprocesos ( IEEE Std 1003.1c-1995) define una API para la gestión, sincronización y programación de subprocesos.

Existen implementaciones de esta API para una gran cantidad de sistemas operativos tipo UNIX ( GNU/Linux , Solaris , FreeBSD , OpenBSD , NetBSD , OS X ), así como para Microsoft Windows y otros sistemas operativos.

Las bibliotecas que implementan este estándar (y las funciones de este estándar) generalmente se denominan Pthreads (las funciones tienen el prefijo "pthread_").

Funciones básicas de la norma

Pthreads define un conjunto de tipos y funciones en el lenguaje de programación C. El archivo de encabezado  es pthread.h.

Ejemplo

Un ejemplo de uso de hilos en lenguaje C :

#incluir <stdio.h> #incluir <stdlib.h> #incluir <tiempo.h> #incluir <pthread.h> vacío espera_hilo ( vacío ); vacío * thread_func ( vacío * ); int principal ( int argc , char * argv [], char * envp []) { hilo pthread_t ; if ( pthread_create ( & thread , NULL , thread_func , NULL )) devuelve EXIT_FAILURE ; para ( sin signo int i = 0 ; i < 20 ; i ++ ) { pone ( "a" ); espera_hilo (); } si ( pthread_join ( hilo , NULL )) devuelve EXIT_FAILURE ; devuelve SALIR_ÉXITO ; } void espera_hilo ( void ) { time_t start_time = tiempo ( NULL ); while ( tiempo ( NULL ) == tiempo_inicio ) {} } vacío * thread_func ( vacío * vptr_args ) { para ( sin signo int i = 0 ; i < 20 ; i ++ ) { fputs ( "b \n " , stderr ); espera_hilo (); } devuelve NULL ; }

Un ejemplo del uso de hilos en C++ :

#incluye <cstdlib> #incluir <iostream> #include <memoria> #include <unistd.h> #incluir <pthread.h> hilo de clase { público : Hilo virtual ~ () {} ejecución de vacío virtual () = 0 ; inicio int () { return pthread_create ( & _ThreadId , NULL , Thread :: thread_func , this ); } int wait () { return pthread_join ( _ThreadId , NULL ); } protegido : pthread_t _ThreadId ; Hilo ( const Hilo & ); vacío * thread_func ( vacío * d ) { ( static_cast < Thread *> ( d )) -> ejecutar (); devuelve NULL ; } }; subproceso de prueba de clase : subproceso público { público : TestingThread ( const char * pcszText ) : _pcszText ( pcszText ) {} carrera de vacío virtual () { for ( int sin signo i = 0 ; i < 20 ; i ++ , Sleep ( 1000 )) std :: cout << _pcszText << std :: endl ; } protegido : const char * _pcszText ; }; int principal ( int argc , char * argv [], char * envp []) { TestingThread ThreadA ( "a" ); TestingThread ThreadB ( "b" ); devolver ThreadA . inicio () || Hilo B. inicio () || Hilo A. esperar () || Hilo B. espera () ? SALIR_FALLO : SALIR_ÉXITO ; }

Los programas que se muestran utilizan dos subprocesos que imprimen mensajes en la consola, uno que imprime 'a' y otro que imprime 'b'. La salida de mensajes se mezcla como resultado del cambio de ejecución entre subprocesos o la ejecución concurrente en sistemas multiprocesador .

La diferencia es que el programa C crea un nuevo subproceso para imprimir 'b', mientras que el subproceso principal imprime 'a'. El subproceso principal (después de imprimir 'aaaa….') espera a que finalice el subproceso secundario.

El programa C++ crea dos hilos nuevos, uno imprime 'a', el otro imprime 'b' respectivamente. El subproceso principal está esperando a que se completen ambos subprocesos secundarios.

Véase también

Enlaces