Pthreads
# Pthreads

Los hilos de POSIX, también conocidos como pthreads, son un modelo de ejecución independiente del lenguaje de programación. Este modelo permite que un programa controle varios flujos de trabajo diferentes que se solapan en el tiempo. A cada uno de estos flujos de trabajo se los conoce como subprocesos, y su creación y control se realiza mediante llamadas a la API de hilos de POSIX, definida por el estándar POSIX.1c, extensiones a los hilos (IEEE Std 1003.1c-1995).

Hay implementaciones de la API en muchos sistemas operativos compatibles con POSIX o similares a UNIX, como por ejemplo FreeBSD, NetBSD, OpenBSD, Linux, macOS, Android, Solaris, Redox y AUTOSAR Adaptive. Estas implementaciones normalmente vienen en forma de librería. En Microsoft Windows también hay implementaciones, aunque no nativas: con SFU/SUA se podían utilizar los hilos de POSIX, o bien con librerías externas como pthreads-w32, que implementa el funcionamiento de pthreads utilizando el API nativo de hilos de Windows.

## Contenido

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

Existen alrededor de 100 procedimientos, todos con el prefijo pthread_, y pueden dividirse en cuatro categorías:

* Gestión de hilos (creación, sincronización al finalizar, etc.).
* Exclusión mutua.
* Monitores.
* Sincronización entre hilos.

La API de semáforos POSIX funciona con los hilos de POSIX, pero no forma parte del estándar ya que se definió en la extensión POSIX.1b, extensiones de tiempo real (IEEE Std 1003.1b-1993). Como consecuencia de ello, los procedimientos de semáforo tienen el prefijo sem_ en lugar de pthread_.

## Ejemplo

Un ejemplo que ilustra el uso de pthreads en C:

Este programa crea cinco hilos, cada uno de los cuales ejecuta la función realiza_trabajo que imprime el identificador del hilo por salida estándar. Para compilar este programa utilizamos gcc:

Y este es uno de las posibles salidas al ejecutar el programa:

## Hilos de POSIX para Windows

Windows no soporta el estándar de pthreads de forma nativa. Hay proyectos de terceros, como Pthreads4w, que buscan aportar un wrapper o envoltorio de implementación. Este proyecto también se puede usar para portabilizar código desarrollado para Unix a Windows, con pocas o ninguna modificación.

El proyecto MinGW-w64 también contiene un wrapper que implementa pthreads, llamado winpthreads. Su intención es usar llamadas al sistema nativas, a diferencia del proyecto Pthreads4w.

El subsistema Interix, disponible en el paquete Servicios de Windows para UNIX/SFU proporciona un puerto nativo de la API de pthreads, esto es, no utiliza la API de Win32 sino directamente la interfaz de llamadas al sistema operativo.

