Articulo de referencia

pthreads

In computing , POSIX Threads , commonly known as pthreads (after its header <pthread.h> ), is an execution model that exists independently from a programming language , as well ...

In computing, POSIX Threads, commonly known as pthreads (after its header <pthread.h>), is an execution model that exists independently from a programming language, as well as a parallel execution model. It allows a program to control multiple different flows of work that overlap in time. Each flow of work is referred to as a thread, and creation and control over these flows is achieved by making calls to the POSIX Threads API. POSIX Threads is an API defined by the Institute of Electrical and Electronics Engineers (IEEE) standard POSIX.1c, Threads extensions (IEEE Std 1003.1c-1995).

Implementations of the API are available on many Unix-like POSIX-conformant operating systems such as FreeBSD, NetBSD, OpenBSD, Linux, macOS, Android,[1]Solaris, Redox, QNX, and AUTOSAR Adaptive, typically bundled as a library libpthread. DR-DOS and Microsoft Windows implementations also exist: within the SFU/SUA subsystem which provides a native implementation of a number of POSIX APIs, and also within third-party packages such as pthreads-w32,[2] which implements pthreads on top of existing Windows API.

Contents

pthreads defines a set of C programming language types, functions and constants. It is implemented with a pthread.h header and a thread library.

There are around 100 threads procedures, all prefixed pthread_ and they can be categorized into five groups:

The POSIX semaphore API works with POSIX threads but is not part of the threads standard, having been defined in the POSIX.1b, Real-time extensions (IEEE Std 1003.1b-1993) standard. Consequently, the semaphore procedures are prefixed by sem_ instead of pthread_.

Example

An example illustrating the use of pthreads in 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