Articulo de referencia

pthreads

En informática , los hilos POSIX , comúnmente conocidos como pthreads (por su archivo de cabecera <pthread.h> ), son un modelo de ejecución independiente del lenguaje de program...

En informática , los hilos POSIX , comúnmente conocidos como pthreads (por su archivo de cabecera <pthread.h> ), son un modelo de ejecución independiente del lenguaje de programación , así como un modelo de ejecución paralela . Permiten que un programa controle múltiples flujos de trabajo que se superponen en el tiempo. Cada flujo de trabajo se denomina hilo , y su creación y control se logran mediante llamadas a la API de hilos POSIX . Los hilos POSIX son una API definida por el estándar POSIX .1c, Extensiones de hilos (IEEE Std 1003.1c-1995) del Instituto de Ingenieros Eléctricos y Electrónicos (IEEE) .

Las implementaciones de la API están disponibles en muchos sistemas operativos tipo Unix compatibles con POSIX , como FreeBSD , NetBSD , OpenBSD , Linux , macOS , Android , [ 1 ] Solaris , Redox , QNX y AUTOSAR Adaptive, normalmente empaquetadas como una biblioteca libpthread . También existen implementaciones para DR-DOS y Microsoft Windows : dentro del subsistema SFU/SUA que proporciona una implementación nativa de varias API POSIX, y también dentro de paquetes de terceros como pthreads-w32 , [ 2 ] que implementa pthreads sobre la API de Windows existente .

Contenido

pthreads define un conjunto de tipos , funciones y constantes del lenguaje de programación C. Se implementa con un archivo de cabecera y una biblioteca de hilos .pthread.h

Existen alrededor de 100 procedimientos de subprocesos, todos con prefijo pthread_, y se pueden clasificar en cinco grupos:

La API de semáforos POSIX funciona con subprocesos POSIX, pero no forma parte del estándar de subprocesos, ya que se definió en el estándar POSIX.1b, Extensiones en tiempo real (IEEE Std 1003.1b-1993) . En consecuencia, los procedimientos de semáforos se anteponen a sem_en lugar de pthread_.

Ejemplo

Un ejemplo que ilustra el uso de pthreads en C:

#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h>#define NUM_THREADS 5void * perform_work ( void * arguments ){ int index = * (( int * ) arguments ); int sleep_time = 1 + rand () % NUM_THREADS ; printf ( "Hilo %d: Iniciado. \n " , index ); printf ( "Hilo %d: Estará durmiendo durante %d segundos. \n " , index , sleep_time ); sleep ( sleep_time ); printf ( "Hilo %d: Finalizado. \n " , index ); return NULL ; }int main ( void ) { pthread_t threads [ NUM_THREADS ]; int thread_args [ NUM_THREADS ]; int result_code ; // Crear todos los hilos uno por uno for ( int i = 0 ; i < NUM_THREADS ; i ++ ) { printf ( "En main: Creando hilo %d. \n " , i ); thread_args [ i ] = i ; result_code = pthread_create ( & threads [ i ], NULL , perform_work , & thread_args [ i ]); assert ( ! result_code ); }printf ( "En main: Todos los hilos se han creado. \n " );// esperar a que cada hilo termine for ( int i = 0 ; i < NUM_THREADS ; i ++ ) { result_code = pthread_join ( threads [ i ], NULL ); assert ( ! result_code ); printf ( "En main: El hilo %d ha terminado. \n " , i ); }printf ( "El programa principal ha finalizado. \n " ); return 0 ; }

Este programa crea cinco hilos, cada uno ejecutando la función `perform_work` que imprime el número único de este hilo en la salida estándar. Si un programador quisiera que los hilos se comunicaran entre sí, esto requeriría definir una variable fuera del ámbito de cualquiera de las funciones, convirtiéndola en una variable global . Este programa se puede compilar usando el compilador gcc con el siguiente comando:

gcc pthreads_demo.c -pthread -o pthreads_demo

Aquí se muestra uno de los muchos resultados posibles al ejecutar este programa.

En main: Creando hilo 0. En main: Creando hilo 1. En main: Creando hilo 2. En main: Creando hilo 3. Hilo 0: Iniciado. En main: Creando hilo 4. Hilo 3: Iniciado. Hilo 2: Iniciado. Hilo 0: Dormirá durante 3 segundos. Hilo 1: Iniciado. Hilo 1: Dormirá durante 5 segundos. Hilo 2: Dormirá durante 4 segundos. Hilo 4: Iniciado. Hilo 4: Dormirá durante 1 segundo. En main: Todos los hilos se han creado. Hilo 3: Dormirá durante 4 segundos. Hilo 4: Finalizado. Hilo 0: Finalizado. En main: El hilo 0 ha finalizado. Hilo 2: Finalizado. Hilo 3: Finalizado. Hilo 1: Finalizado. En main: El hilo 1 ha finalizado. En main: El hilo 2 ha finalizado. En main: El hilo 3 ha finalizado. En main: El hilo 4 ha finalizado. El programa principal ha finalizado.

Hilos POSIX para Windows

Windows no admite el estándar pthreads de forma nativa; por lo tanto, el proyecto Pthreads4w busca proporcionar una implementación de envoltura portátil y de código abierto. También se puede usar para portar software Unix (que usa pthreads) con poca o ninguna modificación a la plataforma Windows. [ 4 ] Pthreads4w versión 3.0.0 [ 5 ] o posterior, publicada bajo la Licencia Pública Apache v2.0, es compatible con sistemas Windows de 64 bits o 32 bits. La versión 2.11.0, [ 6 ] publicada bajo la licencia LGPLv3, también es compatible con 64 bits o 32 bits.

El proyecto Mingw-w64 también contiene una implementación de envoltura de 'pthreads, winpthreads , que intenta usar más llamadas al sistema nativas que el proyecto Pthreads4w. [ 7 ]

El subsistema de entorno Interix disponible en el paquete Windows Services for UNIX/Subsystem for UNIX-based Applications proporciona una adaptación nativa de la API pthreads, es decir, no está mapeada en la API Win32 sino que se basa directamente en la interfaz de llamadas al sistema del sistema operativo . [ 8 ]

Véase también

Referencias

  1. "libc/bionic/pthread.c - platform/bionic - Git en Google" . android.googlesource.com .
  2. "Pthread Win-32: Nivel de conformidad con los estándares" . 22/12/2006. Archivado del original el 11/06/2010 . Consultado el 29/08/2010 .
  3. "pthread.h(0p) — Página del manual de Linux" . Consultado el 18 de diciembre de 2022 .
  4. Hart, Johnson M. (21 de noviembre de 2004). "Experimentos con la biblioteca de código abierto Pthreads y algunos comentarios" . Archivado del original el 30 de agosto de 2010. Recuperado el 29 de agosto de 2010 .
  5. Archivo: pthreads4w-code-v3.0.0.zip – Código fuente de pthreads4w v3.0.0
  6. Archivo: pthreads4w-code-v2.11.0.zip – Código fuente de pthreads4w v2.11.0
  7. ver http://locklessinc.com/articles/pthreads_on_windows que es de donde se derivó originalmente
  8. "Capítulo 1: Introducción a los servicios de Windows para UNIX 3.5" . 5 de diciembre de 2007.

Lecturas adicionales

  • David R. Butenhof (1997). Programación con hilos POSIX . Addison-Wesley. ISBN 978-0-201-63392-4.
  • Bradford Nichols; Dick Buttlar; Jacqueline Proulx Farell (septiembre de 1996). Programación con Pthreads . O'Reilly & Associates. ISBN 978-1-56592-115-3.
  • Charles J. Northrup (25 de enero de 1996). Programación con hilos UNIX . John Wiley & Sons. ISBN 978-0-471-13751-1.
  • Kay A. Robbins y Steven Robbins (2003). Programación de sistemas UNIX . Prentice-Hall. ISBN 978-0-13-042411-2.
  • Especificaciones básicas de The Open Group, edición 7, IEEE Std 1003.1