This shows you the differences between two versions of the page.
|
app:laboratoare:04 [2024/10/29 02:37] alexandru.bala [Variabile condiție] |
app:laboratoare:04 [2025/11/12 05:03] (current) alexandru.bala [Variabile condiție] |
||
|---|---|---|---|
| Line 178: | Line 178: | ||
| void *f(void *arg) | void *f(void *arg) | ||
| { | { | ||
| - | // facem lock pe mutex | + | // facem lock pe mutex |
| pthread_mutex_lock(&mutex); | pthread_mutex_lock(&mutex); | ||
| - | // zona critica | + | // zona critica |
| a += 2; | a += 2; | ||
| - | // facem unlock pe mutex | + | // facem unlock pe mutex |
| pthread_mutex_unlock(&mutex); | pthread_mutex_unlock(&mutex); | ||
| Line 194: | Line 194: | ||
| int arguments[NUM_THREADS]; | int arguments[NUM_THREADS]; | ||
| - | // cream mutexul | + | // creăm mutex-ul |
| pthread_mutex_init(&mutex, NULL); | pthread_mutex_init(&mutex, NULL); | ||
| Line 261: | Line 261: | ||
| for (i = 0; i < NUM_THREADS; i++) { | for (i = 0; i < NUM_THREADS; i++) { | ||
| pthread_join(threads[i], &status); | pthread_join(threads[i], &status); | ||
| - | } | + | } |
| pthread_barrier_destroy(&barrier); | pthread_barrier_destroy(&barrier); | ||
| + | |||
| return 0; | return 0; | ||
| } | } | ||
| Line 358: | Line 360: | ||
| pthread_mutex_init (&mutex, NULL); | pthread_mutex_init (&mutex, NULL); | ||
| - | |||
| sem_init (&full_sem, 0, 0); | sem_init (&full_sem, 0, 0); | ||
| sem_init (&empty_sem, 0, 3); | sem_init (&empty_sem, 0, 3); | ||
| Line 376: | Line 377: | ||
| } | } | ||
| - | pthread_mutex_destroy(&mutex); | + | sem_destroy (&empty_sem); |
| + | sem_destroy (&full_sem); | ||
| + | pthread_mutex_destroy (&mutex); | ||
| return 0; | return 0; | ||
| Line 386: | Line 389: | ||
| 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 478: | Line 481: | ||
| 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); | ||
| Line 490: | Line 493: | ||
| } | } | ||
| + | pthread_cond_destroy (&empty_cond, NULL); | ||
| + | pthread_cond_destroy (&full_cond, NULL); | ||
| pthread_mutex_destroy(&mutex); | pthread_mutex_destroy(&mutex); | ||