stringtranslate.com

hilos

En informática , POSIX Threads , comúnmente conocido como pthreads , es un modelo de ejecución que existe independientemente de un lenguaje de programación , así como un modelo de ejecución paralela . Permite que un programa controle múltiples flujos de trabajo diferentes que se superponen en el tiempo. Cada flujo de trabajo se denomina subproceso , y la creación y el control sobre estos flujos se logra realizando llamadas a la API de subprocesos POSIX . POSIX Threads es una API definida por el estándar POSIX .1c, extensiones de Threads (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 compatibles con POSIX tipo Unix, como FreeBSD , NetBSD , OpenBSD , Linux , macOS , Android , [1] Solaris , Redox y AUTOSAR Adaptive, generalmente empaquetados como una biblioteca libpthread . También existen implementaciones de 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 además de API de Windows existente .

Contenido

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

Hay alrededor de 100 procedimientos de subprocesos, todos con prefijos pthread_y se pueden clasificar en cuatro grupos:

La API del semáforo 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áforo tienen el prefijo en sem_lugar de pthread_.

Ejemplo

Un ejemplo que ilustra el uso de pthreads en C:

#incluye <stdio.h> #incluye <stdlib.h> #incluye <assert.h> #incluye <pthread.h> #incluye <unistd.h>     #definir NUM_THREADS 5void * perform_work ( void * argumentos ){ int índice = * (( int * ) argumentos ); int tiempo_dormir = 1 + rand () % NUM_THREADS ; printf ( "Subproceso %d: Iniciado. \n " , índice ); printf ( "Subproceso %d: Estará inactivo durante %d segundos. \n " , índice , tiempo_dormir ); dormir ( hora_dormir ); printf ( "Subproceso %d: Finalizado. \n " , índice ); devolver NULO ; }                         int main ( void ) { pthread_t subprocesos [ NUM_THREADS ]; int thread_args [ NUM_THREADS ]; int yo ; int código_resultado ; //crea todos los hilos uno por uno for ( i = 0 ; i < NUM_THREADS ; i ++ ) { printf ( "En principal: Creando hilo %d. \n " , i ); thread_args [ yo ] = yo ; result_code = pthread_create ( & subprocesos [ i ], NULL , perform_work y thread_args [ i ]) ; afirmar ( ! código_resultado ); }                                   printf ( "En principal: se crean todos los hilos. \n " ); //espera a que se complete cada hilo for ( i = 0 ; i < NUM_THREADS ; i ++ ) { result_code = pthread_join ( threads [ i ], NULL ); afirmar ( ! código_resultado ); printf ( "En principal: el hilo %d ha finalizado. \n " , i ); }                  printf ( "El programa principal ha finalizado. \n " ); devolver 0 ; }  

Este programa crea cinco subprocesos, cada uno de los cuales ejecuta la función perform_work que imprime el número único de este subproceso en la salida estándar. Si un programador quisiera que los hilos se comunicaran entre sí, esto requeriría definir una variable fuera del alcance 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

Este es uno de los muchos resultados posibles al ejecutar este programa.

En principal: Creando hilo 0. En principal: Creando hilo 1. En principal: Creando hilo 2. En principal: Creando hilo 3. Hilo 0: Iniciado. En principal: 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: Estaré durmiendo durante 4 segundos. Hilo 4: iniciado. Hilo 4: Dormiré durante 1 segundo. En principal: se crean todos los hilos. Hilo 3: Dormiré durante 4 segundos. Hilo 4: Terminado. Hilo 0: Finalizado. En principal: el hilo 0 ha finalizado. Hilo 2: Terminado. Hilo 3: Terminado. Hilo 1: Terminado. En principal: el hilo 1 ha finalizado. En principal: el hilo 2 ha finalizado. En principal: el hilo 3 ha finalizado. En principal: el hilo 4 ha finalizado. El programa principal ha finalizado.

Hilos POSIX para Windows

Windows no soporta el estándar pthreads de forma nativa, por lo tanto, el proyecto Pthreads4w busca proporcionar una implementación contenedora portátil y de código abierto. También se puede utilizar para portar software Unix (que utiliza 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 o 32 bits. La versión 2.11.0, [6] publicada bajo la licencia LGPLv3, también es compatible con 64 o 32 bits.

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

El subsistema de entorno Interix disponible en el paquete Servicios de Windows para UNIX/Subsistema para aplicaciones basadas en UNIX proporciona un puerto nativo de la API pthreads, es decir, no está asignado a la API de Win32 sino que se construye directamente en la interfaz de llamada al sistema del sistema operativo . [8]

Ver también

Referencias

  1. ^ "libc/bionic/pthread.c - plataforma/bionic - Git en Google". android.googlesource.com .
  2. ^ "Pthread Win-32: nivel de conformidad con los estándares". 2006-12-22. Archivado desde el original el 11 de junio de 2010 . Consultado el 29 de agosto de 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 Pthreads de código abierto y algunos comentarios". Archivado desde el original el 30 de agosto de 2010 . Consultado el 29 de agosto de 2010 .
  5. ^ Archivo: pthreads4w-code-v3.0.0.zip - Fuente de pthreads4w v3.0.0
  6. ^ Archivo: pthreads4w-code-v2.11.0.zip - Fuente de pthreads4w v2.11.0
  7. ^ consulte http://locklessinc.com/articles/pthreads_on_windows, 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.

Otras lecturas

enlaces externos