Firul este firul care

În secțiunea precedentă, am ridicat problema de fire, ia în considerare în detaliu.

La fel ca un sistem de operare multitasking pot face mai multe lucruri în același timp, folosind procedee diferite, un proces poate face multe lucruri cu câteva fire. Fiecare filament execută independent de control al fluxului cu contor de program, registrul și un teanc de context. Conceptele de proces și fir sunt foarte strâns legate, și, prin urmare, sunt rareori distincte, chiar fire numite adesea procese ușoare. Principalele diferențe față de firul de proces constă în faptul că fiecare proces are propriul său independent de cealaltă zonă de memorie, tabelul de fișiere deschise, directorul curent, și alte nucleu de informații. Firul nu este legat direct de aceste entități. Toate firele care fac parte din procesul de toate generalul enumerate mai sus, deoarece face parte din acest proces. În plus, procesul este întotdeauna o entitate la nivel de kernel, care este, kernel-ul știe despre existența sa, în timp ce fire este de multe ori entități la nivel de utilizator și de bază nu poate ști nimic despre asta. În astfel de realizări, toate datele sunt stocate firului în zona de utilizare, și, prin urmare, astfel de proceduri ca cauzează sau comutarea între firele nu au nevoie de acces la nucleu și să ia un ordin de mărime mai puțin timp.

Creați fire și POSIX ideologie api

Atunci când o abordare de nivel scăzut pentru firul de sprijin în limba tuturor operațiunilor conexe sunt exprimate explicit în termeni de apeluri de funcții. Prin urmare, acum că avem o idee generală despre ceea ce un fir, este timpul să ia în considerare în ce mod putem crea și gestiona firul în programele noastre. Permiteți-mi să vă reamintesc că vorbim despre în C interfață limbă și de susținere a programelor de fire în conformitate cu standardul POSIX. In conformitate cu aceasta firul este creat cu apelul următor:

pthread_create int (pthread_t * filet, const pthread_attr_t * attr, void * (* Start) (void *), void * arg)

pthread_create Easy Call [Thr, NULL, începe, NULL] va crea un fir, care va începe să acționeze ca punct de pornire și de a scrie în Thr fir creat identificator de variabilă. Un exemplu al acestui apel, vom discuta unele concepte auxiliare API POSIX, pentru a nu locui asupra lor mai departe.

Primul argument al firului funcției - un pointer la o variabilă de tip pthread_t, în care identificatorul firului creat va fi scris, care ulterior pot fi transferate la alte provocări, atunci când vrem să facem ceva cu acest thread. Aici ne confruntăm cu primul aspect al POSIX API, și anume opacitate a tipurilor de bază. Faptul că aproape nu se poate spune nimic despre tipul de pthread_t. Nu știm dacă este întreg sau un pointer? Suntem prin care se dispune între valorile de acest tip nu se poate spune există, că este, dacă este posibil să se construiască un lanț de ele sunt non-descrescătoare. Singurul lucru menționat în standardul este că aceste valori pot fi copiate, și că, folosind un apel la int pthread_equal [pthread_t thr1, pthread_t Thr2] putem stabili atât thr1 identitatea și Thr2 identifica același fir [în acest caz, ele pot fi inegale în sensul operatorului de egalitate]. Aceste proprietăți sunt cele mai multe tipuri folosite în acest standard, în plus, au tendința de a chiar valori ale acestor tipuri nu pot copia!

Al doilea argument al acestei funcții attr - un pointer la o variabilă de tip pthread_attr_t, care definește un set de unele dintre proprietățile firului produs. Aici ne confruntăm cu o a doua caracteristică a API POSIX, și anume conceptul de atribute. Faptul este că acest API, în toate cazurile, atunci când creați sau inițializează un obiect este necesar pentru a defini un set de alte dintre proprietățile sale, în loc să specificați acest set, folosind setul de parametri este invocat cu transmisie obiectul de pre-construite care reprezintă setul de atribute. Această soluție are cel puțin două avantaje. În primul rând, putem repara un set de parametri la funcția fără amenințarea de schimbare în viitor, atunci când acest obiect va avea proprietăți noi. În al doilea rând, putem reutiliza același set de atribute pentru a crea un set de obiecte.

Al treilea argument pentru a pthread_create apel este un pointer la o funcție de tip void * () [void *]. Este această funcție și începe executarea firul nou creat, în același timp, ca un parametru la funcția este trecut patru argumente într-un apel pthread_create. Astfel, este posibil, cu o singură mână pentru a parameterize codul creat de firul care se va efectua, pe de altă parte, paramentrarea datele sale diferite de cod transmis.

Funcția pthread_create se întoarce la zero în caz de succes și zero, fără cod de eroare în caz de eșec. Este, de asemenea, una dintre caracteristicile API POSIX, în loc de standard pentru abordarea Unix atunci când funcția returnează doar o eroare de lumină și codul de eroare setează errno variabila, funcțiile API pthreads returna un cod de eroare, ca urmare a argumentului său. Evident, acest lucru se datorează faptului că, odată cu apariția a programului de mai multe fire care cauzează diferite funcții returnează un cod de eroare în aceeași errno variabilă globală este, există un haos complet, și anume, nu există nici o garanție că codul de eroare care este acum în această variabilă este rezultatul apelului a avut loc în acest lucru și nu un alt fir. Cu toate că, din cauza numărului mare de funcții deja folosind nr_er fire de bibliotecă și furnizează o copie a errno pentru fiecare fir care ar putea fi folosite în firul de bibliotecă, în principiu, dar creatorii standard, au ales o mai corectă și cel mai important, o abordare mai rapidă, în care funcțiile API pur și simplu a reveni coduri de eroare.

articole similare