salve a tutti, sto cercando di comprendere per bene il concetto di variabili di condizione, ma mi sa di non aver ancora ben chiare le dinamiche di sincronizzazione fra threads... ho scritto del codice di prova per un esercizio che chiedeva di generare 2 matrici nxn e con n threads fare le somme riga per riga per ottenere una terza matrice in cui gli elementi corrispondono appunto alle somme degli elementi delle matrice precedenti. un n+1esimo thread attende il completamento della terza matrice e la riproduce a video.
non capisco perchè, tuttavia la stampa della matrice risultato mi da problemi: alle volte stampa una riga in più, alle volte una riga in meno, alle volte avviene correttamente.
Suppongo la natura del problema risieda nell'uso errato della variabile di condizione.
Sapreste dirmi se sbaglio ad implementare il meccanismo di sincronizzazione, o qualcosa di simile?
il codice è il seguente:
codice:#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<pthread.h> #include<time.h> int *ma,*mb,*mc; int global=0,cont=0,n; pthread_t *td; pthread_cond_t cond=PTHREAD_COND_INITIALIZER; pthread_mutex_t mut1,mut2=PTHREAD_MUTEX_INITIALIZER; void *mat() { int local,i; pthread_mutex_lock(&mut1); local=global; global++; pthread_mutex_unlock(&mut1); for(i=0;i<n;i++) *(mc+local*n+i)=(*(mb+local*n+i))+(*(ma+local*n+i)); pthread_mutex_lock(&mut2); cont++; if(cont==n) pthread_cond_signal(&cond); pthread_mutex_unlock(&mut2); } void *ver() { int i,j; pthread_mutex_lock(&mut2); while(cont<n) pthread_cond_wait(&cond,&mut2); pthread_mutex_unlock(&mut2); printf("\n\n--Matrice Risultante--\n\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%d ",*(mc+i*n+j)); } printf("\n"); } } .... int main () ....