Documente Academic
Documente Profesional
Documente Cultură
Laborator 4
Deoarece semafoarele, ca si variabilele conditionale, pot returna valori nenule datorate unor
false “treziri”, folosirea corecta presupune utilizarea unui ciclu “while” de forma urmatoare:
1
Toate functiile returneaza 0 in caz de succes si -1 in caz de eroare
1
int sem_post(sem_t* sem);
Incrementeaza valoarea semaforului “sem”. Daca exista procese ce asteapta
la semafor, unul din ele va reveni din sem_wait(). Procesul cu prioritatea
cea mai mare va fi deblocat, iar in cazul in care sunt mai multe procese cu
prioritate maxima, va fi deblocat cel care asteapta de cel mai mult timp.
int sem_wait(sem_t* sem);
Decrementeaza valoarea semaforului “sem” si, daca valoarea sa nu este mai
mare de zero, blocheaza procesul care a apelat-o. Procesul isi poate
continua executia daca alte procese incrementeaza valoarea semaforului
int sem_trywait(sem_t* sem);
Wait fara blocare. Decrementeaza valoarea semaforului “sem” daca
valoarea sa este mai mare de zero, altfel face doar return.
Desfasurarea lucrarii:
Exemplu:
Utilizarea semafoarelor pentru sincronizarea firelor de executie.
Sincronizare de tip one-to-many.
Se considera o aplicatie formata din doua tipuri de taskuri: un task (fir de executie)
"producator" care produce un set de date si mai multe taskuri (fire de executie) de tip "consumator"
care consuma datele. Taskul "producator" va putea produce un nou set de date doar dupa ce toate
taskurile de tip "consumator" au preluat datele.
$ ./ex_sem_thread.out