POSIX Threads
# POSIX Threads

I POSIX Threads, solitamente denominati pthreads, sono un modello di esecuzione che esiste indipendentemente da un linguaggio di programmazione, nonché un modello di esecuzione parallelo. Consente a un programma di controllare più flussi di lavoro diversi che si sovrappongono nel tempo. Ogni flusso di lavoro viene definito thread e la creazione e il controllo di questi flussi si ottiene effettuando chiamate all'API dei thread POSIX. POSIX Threads è un'API definita dalle estensioni standard di POSIX.1c, Thread (IEEE Std 1003.1c-1995).

Le implementazioni delle API sono disponibili su molti sistemi operativi simili a Unix e conformi allo standard POSIX, come FreeBSD, NetBSD, OpenBSD, Linux, Mac OS X, Android e Solaris. In genere sono raggruppati in una libreria denominata libpthread. Esistono anche implementazioni DR-DOS e Microsoft Windows: all'interno del sottosistema SFU/SUA che fornisce un'implementazione nativa di un certo numero di API POSIX e anche all'interno di pacchetti di terze parti come pthreads-w32, che implementa pthreads sopra le API Windows esistente.

## Contenuti

pthreads definisce un insieme di tipi, funzioni e costanti in linguaggio C. È implementato con un'intestazione pthread.h e una libreria di thread.

Esistono circa 100 procedure di thread, tutte con prefisso pthread_ e possono essere classificate in quattro gruppi:

* Gestione dei thread: creazione, unione, ecc.
* mutex
* Variabili di condizione
* Sincronizzazione tra thread utilizzando blocchi di lettura/scrittura e barriere

L'API POSIX dei semafori funziona con i thread POSIX ma non fa parte dei thread standard, essendo stata definita nello standard POSIX.1b - estensioni in tempo reale (IEEE Std 1003.1b-1993). Di conseguenza, le procedure del semaforo sono precedute da sem_ invece di pthread_.

## Esempio

Un esempio che illustra l'uso di pthread in linguaggio C:

Questo programma crea cinque thread, ognuno dei quali esegue la funzione perform_work che stampa il numero univoco del thread sullo standard output. Se un programmatore desidera che i thread comunichino tra loro, ciò richiederebbe la definizione di una variabile al di fuori dell'ambito di ciascuna funzione, rendendola una variabile globale. Questo programma può essere compilato usando il compilatore gcc con il seguente comando:

## POSIX Threads per Windows

Windows non supporta lo standard pthreads in modo nativo, pertanto il progetto Pthreads-w32 cerca di fornire un'implementazione wrapper portatile e open source. Può anche essere usato per portare il software Unix (che utilizza pthreads) con poca o nessuna modifica alla piattaforma Windows. Con alcune patch aggiuntive l'ultima versione 2.8.0 è compatibile con i sistemi Windows a 64 bit. Si dice che anche la versione 2.9.0 sia compatibile a 64 bit.

Il progetto mingw-w64 contiene anche un'implementazione di wrapper di pthreads chiamata winpthreads, che tenta di utilizzare più chiamate di sistema native rispetto al progetto Pthreads-w32.

Il sottosistema di ambiente Interix disponibile in Windows Services for UNIX/Subsystem for UNIX-based Application fornisce una porta nativa dell'API pthreads, ossia non mappata sull'API Win32/Win64 ma costruita direttamente sull'interfaccia syscall del sistema operativo.

