Firele POSIX

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Firele POSIX , denumite de obicei pthreaduri , sunt un model de execuție care există independent de un limbaj de programare, precum și un model de execuție paralel. Acesta permite unui program să controleze mai multe fluxuri de lucru diferite care se suprapun în timp. Fiecare flux de lucru este denumit subiect, iar crearea și controlul acestor fluxuri se realizează prin efectuarea de apeluri către API-ul POSIX Threads. Threads POSIX este un API definit de extensiile standard POSIX.1c, Thread (IEEE Std 1003.1c-1995).

Implementările API sunt disponibile pe multe sisteme de operare similare Unix și POSIX, cum ar fi FreeBSD, NetBSD, OpenBSD, Linux, Mac OS X, Android și Solaris. Acestea sunt de obicei grupate într-o bibliotecă numită libpthread . Există, de asemenea, implementări DR-DOS și Microsoft Windows: în subsistemul SFU / SUA care oferă o implementare nativă a unui număr de API-uri POSIX și, de asemenea, în cadrul pachetelor terțe, cum ar fi pthreads-w32, care implementează pthreads deasupra API-ului Windows existent.

Cuprins

pthreads definește un set de tipuri, funcții și constante de limbaj C. Este implementat cu un antet pthread.h și o bibliotecă de fire.

Există aproximativ 100 de proceduri de thread, toate prefixate cu pthread_ și pot fi clasificate în patru grupuri:

  • Gestionarea firelor: creație, unire etc.
  • mutex
  • Variabile de condiție
  • Sincronizarea între fire utilizând blocuri de citire / scriere și bariere

API-ul semafor POSIX funcționează cu thread-uri POSIX, dar nu face parte din thread-urile standard, fiind definit în POSIX.1b - standard în timp real pentru extensii (IEEE Std 1003.1b-1993) . În consecință, procedurile de semafor sunt precedate de sem_ în loc de pthread_ .

Exemplu

Un exemplu care ilustrează utilizarea pthread în limbajul C:

 #include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <pthread.h>
#include <unistd.h>

#define NUM_THREADS 5

void * perform_work ( nul * argumente ) {
  int index = * (( int * ) argumente );
  int sleep_time = 1 + rand () % NUM_THREADS ;
  printf ( "FILET% d: Început. \ n " , index + 1 );
  printf ( "THREAD% d: Va dormi% d secunde. \ n " , index + 1 , sleep_time );
  somn ( somn_timp );
  printf ( "FILET% d: Încheiat. \ n " , index + 1 );
}

int main () {
  pthread_t fire [ NUM_THREADS ];
  int thread_args [ NUM_THREADS ];
  scurt i ;
  int result_code ;
  
  // creați toate firele unul câte unul
  pentru ( i = 0 ; i < NUM_THREADS ; i ++ ) {
    printf ( "IN MAIN: Crearea firului% d. \ n " , i + 1 );
    fire [ i ] = i ;
    thread_args [ i ] = i ;
    result_code = pthread_create ( & threads [ i ], NULL , perform_work , & thread_args [ i ]);
    afirmă ( ! result_code );
  }

  printf ( "IN MAIN: Toate firele sunt create. \ n " );

  // așteptați finalizarea fiecărui fir
  pentru ( i = 0 ; i < NUM_THREADS ; i ++ ) {
    result_code = pthread_join ( fire [ i ], NULL );
    afirmă ( ! result_code );
    printf ( "IN MAIN: Firul% d s-a încheiat. \ n " , i + 1 );
  }

  printf ( "Programul PRINCIPAL s-a încheiat. \ n " );
  retur 0 ;
}

Acest program creează cinci fire, fiecare executând funcția perform_work care tipărește numărul firului unic la ieșirea standard. Dacă un programator dorește ca firele să comunice între ele, acest lucru ar necesita definirea unei variabile în afara sferei fiecărei funcții, făcând din aceasta o variabilă globală. Acest program poate fi compilat folosind compilatorul gcc cu următoarea comandă:

 gcc pthreads_demo.c -lpthread -o pthreads_demo

Firele POSIX pentru Windows

Windows nu acceptă standardul pthreads în mod nativ, astfel încât proiectul Pthreads-w32 încearcă să ofere o implementare portabilă și open source wrapper . Poate fi, de asemenea, utilizat pentru portarea software-ului Unix (care folosește pthreads ) cu puține sau deloc modificări ale platformei Windows. Cu unele patch-uri suplimentare, ultima versiune 2.8.0 este compatibilă cu sistemele Windows pe 64 de biți. Se spune, de asemenea, că versiunea 2.9.0 este compatibilă pe 64 de biți.

Proiectul mingw-w64 conține, de asemenea, o implementare pthreads wrapper numită winpthreads , care încearcă să utilizeze mai multe apeluri de sistem native decât proiectul Pthreads-w32.

Subsistemul de mediu Interix disponibil în Windows Services pentru UNIX / Subsystem for UNIX-based Application oferă un port nativ al API-ului pthreads , adică nu este mapat la API-ul Win32 / Win64 ci construit direct pe interfața syscall a sistemului de operare .

Notă


Bibliografie

  • David R. Butenhof (1997). Programare cu fire POSIX. Addison-Wesley. ISBN 978-0-201-63392-4 .
  • Bradford Nichols; Dick Buttlar; Jacqueline Proulx Farell (septembrie 1996). Programare Pthreads. O'Reilly & Associates. ISBN 978-1-56592-115-3 .
  • Charles J. Northrup (25-01 1996). Programare cu fire UNIX. John Wiley & Sons. ISBN 978-0-471-13751-1 .
  • Kay A. Robbins și Steven Robbins (2003). Programarea sistemelor UNIX. Prentice-Hall. ISBN 978-0-13-042411-2 .

Elemente conexe

  • Sistem de rulare
  • OpenMP
  • Cilk / Cilk Plus
  • Filetarea blocurilor de construcție (TBB)
  • Biblioteca nativă POSIX Thread (NPTL)
  • DCEThreads
  • clonare (apel sistem Linux)
  • Trezire falsă
  • Depozitare locală a firului
  • Subiecte portabile GNU
  • FSU Pthreads
  • Grand Central Dispatch (biblioteca de fire pentru Apple)
  • Beginthread (un subrutină în Windows pentru a crea un fir nou și un fir Unix)
  • State Threads, o abordare a filetării bazată pe evenimente

linkuri externe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT