PDA

Visualizza la versione completa : [C] variabili di condizione


darksergio
16-09-2012, 18:16
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:




#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 ()
....

Who am I
16-09-2012, 21:01
Facci vedere anche il codice del main cosė si capisce meglio.

darksergio
16-09-2012, 22:28
int main()
{
int i,j;

srand(time(NULL));
fprintf(stderr,"inserire size matrici: ");
scanf("%d",&n);

ma=(int*)calloc(n*n,sizeof(int));
mb=(int*)calloc(n*n,sizeof(int));
mc=(int*)calloc(n*n,sizeof(int));
td=(pthread_t*)calloc(n+1,sizeof(pthread_t));

for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
*(ma+i*n+j)=100+rand()%99;
*(mb+i*n+j)=100+rand()%99;
}
}

printf("\n\n--Matrice A--\n\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",*(ma+i*n+j));
}
printf("\n");
}



printf("\n\n--Matrice B--\n\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",*(mb+i*n+j));
}
printf("\n");
}



for(i=0;i<n;i++)
pthread_create(&td[i],NULL,mat,NULL);

pthread_create(&td[n+1],NULL,ver,NULL);


for(j=0;j<n+1;j++)
pthread_join(td[j],NULL);


return 0;

}

Who am I
17-09-2012, 00:19
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);
pthread_exit(0);
}


Tutti i thread possono modificare i valori della matrice contemporaneamente, quindi i valori letti sono spuri.
Il for devi eseguirlo prima di aprire il mutex.

darksergio
17-09-2012, 04:09
i valori sono giusti, anche perche ogni thread lavora su righe diverse non dovrebbero essere race condition in teoria :S

darksergio
17-09-2012, 13:16
problema di indici stupidissimo, risolto :D

Loading