pthread - pthreads
POSIX Threads , comunemente noto come pthreads , è un modello di esecuzione che esiste indipendentemente da un linguaggio, nonché un modello di esecuzione parallela. 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 su questi flussi si ottengono effettuando chiamate all'API POSIX Threads. POSIX Threads è un'API definita dallo standard POSIX.1c, estensioni Threads ( IEEE Std 1003.1c-1995) .
Le implementazioni dell'API sono disponibili su molti sistemi operativi conformi a POSIX simili a Unix come FreeBSD , NetBSD , OpenBSD , Linux , macOS , Android , Solaris , Redox e AUTOSAR Adaptive, generalmente in bundle come libreria libpthread . Esistono anche implementazioni DR-DOS e Microsoft Windows : all'interno del sottosistema SFU/SUA che fornisce un'implementazione nativa di una serie di API POSIX e anche all'interno di pacchetti di terze parti come pthreads-w32 , che implementa pthread in cima all'API Windows esistente .
Contenuti
pthreads definisce un insieme di tipi , funzioni e costanti del linguaggio di programmazione C. È implementato con un'intestazione e una libreria di thread .
pthread.h
Esistono circa 100 procedure di thread, tutte precedute da un prefisso pthread_e possono essere classificate in quattro gruppi:
- Gestione dei thread: creazione, unione di thread, ecc.
- Mutex
- Variabili di condizione
- Sincronizzazione tra thread utilizzando blocchi e barriere di lettura/scrittura
L' API del semaforo POSIX funziona con i thread POSIX ma non fa parte dello standard dei thread, essendo stata definita nello standard POSIX.1b, Estensioni in tempo reale (IEEE Std 1003.1b-1993) . Di conseguenza, le procedure semafori sono preceduti da sem_anziché pthread_.
Esempio
Un esempio che illustra l'uso dei pthread in C:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <pthread.h>
#include <unistd.h>
#define NUM_THREADS 5
void *perform_work(void *arguments){
int index = *((int *)arguments);
int sleep_time = 1 + rand() % NUM_THREADS;
printf("THREAD %d: Started.\n", index);
printf("THREAD %d: Will be sleeping for %d seconds.\n", index, sleep_time);
sleep(sleep_time);
printf("THREAD %d: Ended.\n", index);
return NULL;
}
int main(void) {
pthread_t threads[NUM_THREADS];
int thread_args[NUM_THREADS];
int i;
int result_code;
//create all threads one by one
for (i = 0; i < NUM_THREADS; i++) {
printf("IN MAIN: Creating thread %d.\n", i);
thread_args[i] = i;
result_code = pthread_create(&threads[i], NULL, perform_work, &thread_args[i]);
assert(!result_code);
}
printf("IN MAIN: All threads are created.\n");
//wait for each thread to complete
for (i = 0; i < NUM_THREADS; i++) {
result_code = pthread_join(threads[i], NULL);
assert(!result_code);
printf("IN MAIN: Thread %d has ended.\n", i);
}
printf("MAIN program has ended.\n");
return 0;
}
Questo programma crea cinque thread, ognuno dei quali esegue la funzione perform_work che stampa il numero univoco di questo thread sullo standard output. Se un programmatore volesse che i thread comunicassero tra loro, ciò richiederebbe la definizione di una variabile al di fuori dell'ambito di una qualsiasi delle funzioni, rendendola una variabile globale . Questo programma può essere compilato utilizzando il compilatore gcc con il seguente comando:
gcc pthreads_demo.c -pthread -o pthreads_demo
Ecco uno dei tanti output possibili dall'esecuzione di questo programma.
IN MAIN: Creating thread 0.
IN MAIN: Creating thread 1.
IN MAIN: Creating thread 2.
IN MAIN: Creating thread 3.
THREAD 0: Started.
IN MAIN: Creating thread 4.
THREAD 3: Started.
THREAD 2: Started.
THREAD 0: Will be sleeping for 3 seconds.
THREAD 1: Started.
THREAD 1: Will be sleeping for 5 seconds.
THREAD 2: Will be sleeping for 4 seconds.
THREAD 4: Started.
THREAD 4: Will be sleeping for 1 seconds.
IN MAIN: All threads are created.
THREAD 3: Will be sleeping for 4 seconds.
THREAD 4: Ended.
THREAD 0: Ended.
IN MAIN: Thread 0 has ended.
THREAD 2: Ended.
THREAD 3: Ended.
THREAD 1: Ended.
IN MAIN: Thread 1 has ended.
IN MAIN: Thread 2 has ended.
IN MAIN: Thread 3 has ended.
IN MAIN: Thread 4 has ended.
MAIN program has ended.
Thread POSIX per Windows
Windows non supporta lo standard pthreads in modo nativo, quindi il progetto Pthreads4w cerca di fornire un'implementazione di wrapper portabile e open source. Può anche essere usato per portare il software Unix (che usa pthreads ) con poche o nessuna modifica alla piattaforma Windows. Pthreads4w versione 3.0.0 o successiva, rilasciata sotto Apache Public License v2.0, è compatibile con i sistemi Windows a 64 o 32 bit. Anche la versione 2.11.0, rilasciata con licenza LGPLv3, è compatibile a 64 o 32 bit.
Il progetto Mingw-w64 contiene anche un'implementazione wrapper di pthreads , winpthreads , che tenta di utilizzare più chiamate di sistema native rispetto al progetto Pthreads4w.
Il sottosistema dell'ambiente Interix disponibile nel pacchetto Windows Services for UNIX/Subsystem for UNIX-based Applications fornisce una porta nativa dell'API pthreads , cioè non mappata sull'API Win32/Win64 ma costruita direttamente sull'interfaccia syscall del sistema operativo .
Guarda anche
- Sistema di runtime
- OpenMP
- Cilk / Cilk Plus
- Blocchi di costruzione di filettatura (TBB)
- Libreria di thread POSIX nativa (NPTL)
- DCEthread
- clone (chiamata di sistema Linux)
- Risveglio spurio
- Archiviazione locale del thread
- Thread portatili GNU
- Grand Central Dispatch (libreria di thread di Apple)
- Beginthread (una subroutine all'interno di Windows per la creazione di un nuovo thread e unix thread)
- State Threads , un approccio al threading guidato dagli eventi
Riferimenti
Ulteriori letture
- David R. Butenhof (1997). Programmazione con thread POSIX . Addison-Wesley. ISBN 978-0-201-63392-4.
- Bradford Nichols; Dick Buttlar; Jacqueline Proulx Farell (settembre 1996). Programmazione dei thread . O'Reilly & Associates. ISBN 978-1-56592-115-3.
- Charles J. Northrup (1996-01-25). Programmazione con thread UNIX . John Wiley & Figli. ISBN 978-0-471-13751-1.
- Kay A. Robbins e Steven Robbins (2003). Programmazione di sistemi UNIX . Prentice-Hall. ISBN 978-0-13-042411-2.