Sunteți pe pagina 1din 1

Aplicatii propuse

Tema - crearea de fire de executie sub standardul Posix.


Variante: mai multe fire cu aceeasi functie sau fire cu functie separata pentru codul de executie.
1. Sa se realizeze un program C/posix ce contine 3 fire, primul fir de executie va tipari un mesaj
primit de el, al 2 lea fir va citi un mesaj si il va tipari, iar al 3-lea doar va afisa id firului de
executie .
2. Programul va primi în linia de comandă perechi caracter număr şi pentru
fiecare pereche va crea câte un fir de execuţie care să afişeze caracter de
număr ori. De exemplu rularea ./ex1 a 5 b 3 c 9 va afişa a de 5 ori, b de 3
ori şi c de 9 ori.
Pentru aceasta va trebui să vă alocaţi un vector de pthread_t/HANDLE ca să puteţi aştepta terminarea
fiecărui fir de execuţie. De asemenea, e nevoie (vezi observaţiile de mai jos) de un vector de structuri pe
care să le pasaţi firelor nou create. Deoarece nu se poate şti de la început câte perechi va da utilizatorul,
alocaţi dinamic memorie pentru cei doi vectori amintiţi.
Puteţi considera că linia de comandă e corect formată din perechi şi că se dau doar caractere, nu şiruri
formate din mai multe caractere.
Observaţii:
a) este greşit să se folosească o singură structură pentru a reţine argumentele şi înainte de
crearea fiecarui thread aceasta să se umple cu datele necesare; din cauză că se trimite doar un
pointer către ea, când firul principal de execuţie va umple structura pentru următorul thread,
modificarea ei se va vedea şi în celelalte fire de execuţie
b) este de asemenea greşit să se folosească o singură structură şi firele create să facă o copie
conţinutului acesteia cand îşi încep execuţia; problema aici este că apare un race: e posibil ca firul
principal să execute mai multe iteraţii în care să suprascrie structura înainte ca firele de execuţie
create să apuce să ruleze şi să îşi creeze copia.

Obsrervatie: Modificaţi exerciţiul 1 astfel încât să folosească Thread Specific Data/Thread Local Storage şi
să permită afişarea de şiruri de caractere, nu doar de caractere.

Mai exact, rularea ./ex2 laborator 2 SO 5 ar trebui sa afiseze într-o ordine oarecare laborator de 2
ori si SO de 5 ori.
Va trebui să modificaţi structura pasată firelor de execuţie astfel încât să conţină un char* în loc
de char. Fiecare fir de execuţie va depune în Thread Specific Data/Thread Local Storage un
pointer către structura primită şi va apela o funcţie care să facă afişarea efectivă. Funcţia ce face
afişarea nu va primi nici un parametru ci va recupera pointerul la structură din Thread Specific
Data/Thread Local Storage.
Observaţi deci că Thread Specific Data/Thread Local Storage se comportă pe de-o parte ca o
variabilă globală (nu a fost nevoie sa trimitem ca parametru pe cine să afişăm funcţiei care face
afişarea) dar, spre deosebire de o variabilă globală obişnuită, este privată fiecărui fir de execuţie.

Tema sincronizare firelor posix (pthred join)


1. Realizati o aplic continand 3 fire, 1 fir citeste elementele unui vector, alt fir afis elementele, al3
lea face suma elementelor.

Tema mecanismul excluderii mutuale


3. Realizati o aplicatie cu patru fire. Un fir citeste elementele unui vector, iar al doilea afiseaza
elementele sale. Al doilea fir va astepta dupa primul sa finalizeze citirea. Apoi, firul trei calculeaza
suma elementelor de pe pozitiile pare iar firul patru suma elementelor de pe pozitiile impare.
Folositi mutex pentru a depune rezultatul intr-o zona comuna de memorie.

4.Să se creeze o aplicatie cu 4 fire de executie: primul fir va calcula suma partială din elemenetele
de pe pozitia 3k, al doilea dupa pozitia 3k+1, al treila de pe pozitia 3k+2. Al patrulea fir va astepta
finalizarea celor trei fir si va insuma cele 3 sume partiale, afişându-le. In programul principal se va
citi si vectorul initial.

S-ar putea să vă placă și