This shows you the differences between two versions of the page.
app:laboratoare:04 [2024/10/29 02:27] alexandru.bala [Semafor] |
app:laboratoare:04 [2024/10/29 02:44] (current) alexandru.bala [Variabile condiție] |
||
---|---|---|---|
Line 386: | Line 386: | ||
Variabilele condiție reprezintă o structură de sincronizare, care au asociat un mutex, și ele au un sistem de notificare a thread-urilor, astfel încât un thread să fie blocat până când apare o notificare de la alt thread. Pentru a putea folosi variabile condiție în pthreads ne folosim de structura ''pthread_cond_t''. | Variabilele condiție reprezintă o structură de sincronizare, care au asociat un mutex, și ele au un sistem de notificare a thread-urilor, astfel încât un thread să fie blocat până când apare o notificare de la alt thread. Pentru a putea folosi variabile condiție în pthreads ne folosim de structura ''pthread_cond_t''. | ||
- | Variabilele condiție sunt folosite pentru a bloca thread-ul curent (mutexul și semaforul blochează celelalte thread-uri). Acestea permit unui thread să se blocheze până când o condiție devine adevărată, moment când condiția este semnalată de thread că a devenit adevărată și thread-ul / thread-urile blocate de condiție își reiau activitatea o variabilă condiție va avea mereu un mutex pentru a avea race condition, care apare când un thread 0 se pregătește să aștepte la variabila condiție și un thread 1 semnalează condiția înainte ca thread-ul 0 să se blocheze | + | Variabilele condiție sunt folosite pentru a bloca thread-ul curent (mutexul și semaforul blochează celelalte thread-uri). Acestea permit unui thread să se blocheze până când o condiție devine adevărată, moment când condiția este semnalată de thread că a devenit adevărată și thread-ul / thread-urile blocate de condiție își reiau activitatea. O variabilă condiție va avea mereu un mutex pentru a avea race condition, care apare când un thread 0 se pregătește să aștepte la variabila condiție și un thread 1 semnalează condiția înainte ca thread-ul 0 să se blocheze. |
Funcții: | Funcții: | ||
Line 395: | Line 395: | ||
* ''int pthread_cond_signal(pthread_cond_t *cond);'' - deblocarea unui thread | * ''int pthread_cond_signal(pthread_cond_t *cond);'' - deblocarea unui thread | ||
* ''int pthread_cond_broadcast(pthread_cond_t *cond);'' - deblocarea tuturor thread-urilor blocate | * ''int pthread_cond_broadcast(pthread_cond_t *cond);'' - deblocarea tuturor thread-urilor blocate | ||
- | * | ||
Exemplu folosire - producer - consumer: | Exemplu folosire - producer - consumer: | ||
<spoiler Click pentru exemplu> | <spoiler Click pentru exemplu> | ||
Line 479: | Line 478: | ||
srand (time (NULL)); | srand (time (NULL)); | ||
for (i = 0; i < NUM_THREADS; i++) { | for (i = 0; i < NUM_THREADS; i++) { | ||
- | type = rand () % 2; | + | type = i % 2; // ar funcționa și rand () % 2 în loc de i % 2? |
if (type == CONSUMER) { | if (type == CONSUMER) { | ||
pthread_create (&tid_v[i], NULL, consumer_func, NULL); | pthread_create (&tid_v[i], NULL, consumer_func, NULL); |