Advertisement
jackdharma1994

Untitled

Jun 28th, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.22 KB | None | 0 0
  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((n % 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement