Programarea C în fluxurile linux - pthreads, cartea personală tetraquark

Programarea C în fluxurile linux - pthreads, cartea personală tetraquark

Multithreading în programare este un mecanism important în zilele noastre. Așa că am decis să dedicăm câteva articole pe această temă.

În Linux, este ceva diferit. Esența procesului este aceeași ca în Windows - este un program executabil cu datele sale. Dar firul din Linux este un proces separat (puteți vedea numele ca un "proces ușor", LWP). Diferența este același. - un program separat de proces cu memoria sa, nu poate accesa direct memoria unui alt proces, dar fluxul, deși un proces separat are acces la memoria procesului părinte [2] Procesele LWP sunt create folosind apelul de sistem clone (), specificând anumite steaguri.







Dar există și un astfel de lucru numit "Threads POSIX" - o bibliotecă standard POSIX care organizează fire în interiorul procesului. De exemplu, paralelizarea se realizează deja în limitele unui proces.

Și aici vine întrebarea despre diferența dintre termenii "flux", "proces", "fir" etc. Problema este că, în literatura engleză acești termeni sunt clar definite, avem la fel cu noastre contradicții mari și puternice sunt care pot duce la disonanță sălbatice.

Dar este vorba în general, pentru informații mai exacte ar trebui să te referi la literatura relevantă sau la documentația oficială, poți citi omul. La sfârșitul articolului, vă voi oferi câteva linkuri utile pentru resurse, unde este descris mai detaliat cum funcționează totul, dar pentru moment să trecem la practică.

Voi uita la două versiuni ale „paralelizare“ a programului - crearea unui flux / filament folosind funcțiile pthread.h (POSIX Fire), sau pentru a crea un proces separat, folosind furca ().

Astăzi, să ne uităm la firele de la biblioteca pthread.







Șablonul de cod pentru lucrul cu firele este după cum urmează:

După cum puteți vedea din cod, esența firului este întruchipată într-o funcție, în acest caz, un threadFunc. Numele unei astfel de funcții poate fi arbitrară, dar tipul de retur și tipul argumentului de intrare trebuie să fie strict nevalid *. Această funcție va fi realizată într-un fir separat de execuție, deci ai nevoie de o atenție deosebită punerii în aplicare a acestei funcții, datorită accesului la aceeași memorie a procesului părinte multe fluxuri. Finalizarea se realizează prin mai multe variante: de curgere a atins punctul de finalizare (retur, pthread_exit (0)), fie fluxul a fost finalizat afară.

Crearea unui fir de a merge mai departe cu pthread_create funcția (pthread_t * TID, const pthread_attr_t * attr, void * (* funcția) (void *), void * arg), în cazul în care: TID - ID-ul firului, attR - parametrii de curgere (NULL - atribute implicite detalii în om), funcția - un pointer la funcția de streaming, în acest caz threadFunc și arg - pointer la fluxul de date transmise.

Funcția pthread_join așteaptă ca firul să se termine. Al doilea parametru al acestei funcții este rezultatul returnat de flux.

Să încercăm acest șablon pentru a scrie un program care să facă ceva util. De exemplu, încercăm să adăugăm două matrice și să stocăm rezultatul în a treia matrice rezultată. Pentru a rezolva această problemă, trebuie să vă gândiți la distribuirea corectă a datelor între fire. Am implementat un algoritm simplu - câte rânduri în matrice, cât mai multe fire. Fiecare flux adaugă elementele rândului primei matrice la elementele rândului celei de-a doua matrice și stochează rezultatul în rândul celei de-a treia matrice. Se pare că fiecare fir funcționează exact cu datele sale și astfel elimină accesul unui fir la datele unui alt fir. Un exemplu de program care utilizează fluxurile pthread este după cum urmează:

Ieșirea în CentOS 7 cu ieșire în consola arată astfel:

Programarea C în fluxurile linux - pthreads, cartea personală tetraquark

Pentru a compila un program folosind pthread, linkerul ar trebui să specifice flagul -lpthread (sau să conecteze biblioteca pthread în IDE). Comanda pentru a compila în gcc va arăta astfel:

gcc -std = c99 principal.c -o main.out -lpthread

Construiți sisteme - face

Memorie scurgere pthread?

Un gând despre "Programarea C în Linux - Threads pthreads"

Bună ziua vizitator!


Numele meu este Vladislav, el este și Tetraquark. Sunt puțin interesat de programare și îmi place să-i spun tuturor de ce mă interesează. Asta fac eu aici.
Sper să vă placă!

Toate sunt:

Articole recente







Articole similare

Trimiteți-le prietenilor: