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:

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

Riferimenti

Ulteriori letture

link esterno