Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    107

    [C] variabili di condizione

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

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Facci vedere anche il codice del main così si capisce meglio.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    107
    codice:
    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;
    
    }

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    codice:
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    107
    i valori sono giusti, anche perche ogni thread lavora su righe diverse non dovrebbero essere race condition in teoria :S

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2011
    Messaggi
    107
    problema di indici stupidissimo, risolto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.