Allocare una matrice dinamicamente di dimensione NxN dove n è un numero pari, inserito come input al programma ( argv ).

Allocare una matrice dinamicamente di dimensione NxN dove n è un numero pari, inserito come input al programma ( argv ). Riempire la matrice con numeri casuali. Lanciare N thread che esaminano ognuno una riga delle N righe della matrice, prelevano un elemento casuale dalla loro riga di competenza, e lo inseriscono in un vettore di dimensione (N^2) /2. Al termine del riempimento di questo vettore viene risvegliato un thread n+1esimo che stampa il numero di elementi inseriti nel vettore da ogni thread e gli elementi inseriti nel vettore da ogni thread. Usare semafori con memoria e variabili di condizione.


risposta :


  1. /*
  2.         Allocare una matrice dinamicamente di dimensione NxN dove n è un numero pari,
  3.         inserito come input al programma ( argv ). Riempire la matrice con numeri casuali.
  4.         Lanciare N thread che esaminano ognuno una riga delle N righe della matrice,
  5.         prelevano un elemento casuale dalla loro riga di competenza, e lo inseriscono in
  6.         un vettore di dimensione (N^2) /2. Al termine del riempimento di questo vettore
  7.         viene risvegliato un thread n+1esimo che stampa il numero di elementi inseriti
  8.         nel vettore da ogni thread e gli elementi inseriti nel vettore da ogni thread.
  9.         Usare semafori con memoria e variabili di condizione.
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <pthread.h>
  15. #include <sys/types.h>
  16. #include <semaphore.h>
  17.  
  18. void *riempitore(void *arg), *conteggiatore(void *arg);
  19. int **matrice;
  20. int n;
  21.  
  22. struct
  23. {       pthread_mutex_t mutex;
  24.         int cont;
  25.         int *vector;
  26.         sem_t sem1,sem2;
  27.        
  28.         pthread_cond_t cond;
  29.  
  30. } bobby = {PTHREAD_MUTEX_INITIALIZER,0};
  31.  
  32. int size_vettore;
  33.  
  34. int main(int arg, char **argv) {
  35.  
  36.         n = atoi(argv[1]);
  37.         int i,j;
  38.         int *riga[n];
  39.         pthread_t p_tids[n+1];
  40.  
  41.         size_vettore = (n*n)/2;
  42.         printf("size vettore %d\n",size_vettore);
  43.  
  44.         bobby.vector = malloc(size_vettore*sizeof(int));
  45.  
  46.         sem_init(&bobby.sem1,0,1);
  47.         sem_init(&bobby.sem2,0,0);
  48.  
  49.         if(arg != 2) { printf("usage:./program n\n"); exit(0);}
  50.         if((% 2) != 0) { printf("Errore: n deve essere pari."); exit(0);}
  51.        
  52.         matrice = (int**) malloc(n*sizeof(int *));
  53.        
  54.         for (i=0;i<n;i++) {
  55.                 matrice[i] = (int *) malloc(n*sizeof(int *));
  56.         }
  57.         for(j=0;j<n;j++) {
  58.                 for(i=0;i<n;i++)
  59.                         matrice[j][i] = rand() % 10;   
  60.         }
  61.  
  62.         for(j=0;j<n;j++) {
  63.                 for(i=0;i<n;i++)
  64.                         printf("|%d",matrice[j][i]);
  65.                 printf("\n");  
  66.         }
  67.         for(i=0;i<n;i++) {
  68.                
  69.                 riga[i] = (int *)malloc(sizeof(int));
  70.                 *riga[i] = i;
  71.  
  72.                 pthread_create(&p_tids[i],NULL,riempitore,(void *) riga[i]);
  73.         }
  74.         pthread_create(&p_tids[n],NULL,conteggiatore,NULL);
  75.  
  76.         for(i=0;i<n;i++) {
  77.                 pthread_join(p_tids[i],NULL);
  78.         }
  79.         pthread_join(p_tids[n],NULL);
  80.        
  81.         sem_destroy(&bobby.sem1);
  82.         sem_destroy(&bobby.sem2);
  83.         pthread_exit(NULL);
  84.  
  85. }
  86. void *riempitore(void *riga) {
  87.         int * myoff,myvoff,value_sem;
  88.         myoff = (int *) riga;
  89.         myvoff = *myoff;
  90.         int value;
  91.         int i,n_casuale,random = rand() % n;
  92.        
  93.         for(;;) {
  94.         n_casuale = matrice[myvoff][random];
  95.        
  96.  
  97.         sem_wait(&bobby.sem1);
  98.                 sem_getvalue(&bobby.sem1,&value_sem);
  99.                 printf("Sono il thread %d\n sem = %d\n",myvoff,value_sem);
  100.                 printf("Sto inserendo l'elemento %d\n",n_casuale);
  101.                
  102.                 if(bobby.cont >= size_vettore) {
  103.                         printf("verificata");
  104.                         pthread_cond_signal(&bobby.cond);
  105.                                 sem_wait(&bobby.sem2);
  106.                 }
  107.                
  108.                
  109.  
  110.                 bobby.vector[bobby.cont] = n_casuale;
  111.                 printf("ho inserito bobby.vector[%d] = %d",bobby.cont, bobby.vector[bobby.cont]);
  112.                 bobby.cont++;
  113.                 printf(" cont=%d\n",bobby.cont);
  114.  
  115.         sem_post(&bobby.sem1);
  116.         }
  117.        
  118.         pthread_exit(0);
  119. }
  120. void *conteggiatore(void *arg) {
  121.         int sum=0,i;
  122.         for(; ;) {
  123.         pthread_mutex_lock(&bobby.mutex);
  124.                 printf("\npartito il conteggiatore\n");
  125.                 while(bobby.cont < size_vettore)
  126.                         pthread_cond_wait(&bobby.cond, &bobby.mutex);
  127.                
  128.                 for(i=0;i<size_vettore;i++) {
  129.                         sum += bobby.vector[i];
  130.                        
  131.                 }
  132.                 bobby.cont = 0;
  133.                
  134.         pthread_mutex_unlock(&bobby.mutex);
  135.         sem_post(&bobby.sem2); }
  136. }


Learn More :