Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.77 KB | None | 0 0
  1. /*
  2.     Si realizzi un programma in C e Posix sotto Linux che, con l'ausilio della libreria Pthread, lancia n thread
  3.     per calcolare ilprodotto degli elementi di ciascuna riga di una matrice nxn di interi generati casualmente
  4.     in un intervallo [0,255] . Il calcolo del prodotto degli elementi di ciascuna riga deve essere effettuato
  5.     concorrentemente su tutte le righe. Calcolati i prodotti, si provvederà a ricercarne il massimo ed a
  6.     stamparlo a video. La dimensione della matrice può essere fornita in input al programma in fase di
  7.     esecuzione o da riga di comando.
  8. */
  9.  
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. #include <pthread.h>
  13. #include <time.h>
  14.  
  15. void *th_rt(void *arg);
  16.  
  17. int *MAT;
  18. int N;
  19. long int MAX=-1;
  20. int row = 0;
  21.  
  22. pthread_mutex_t mutexMax = PTHREAD_MUTEX_INITIALIZER;
  23.  
  24. int main(int argc, char *argv[]){
  25.     pthread_t *tid;
  26.     int i,j;
  27.  
  28.     int *row;
  29.  
  30.     srand(time(NULL));
  31.  
  32.     if(argc < 2){
  33.         printf("usage: ./a.out <int>\n");
  34.         return -1;
  35.     }
  36.  
  37.     N = atoi(argv[1]);
  38.  
  39.     MAT = (int *)malloc(N*N*sizeof(int));
  40.     tid = (pthread_t *)malloc(N*sizeof(pthread_t));
  41.  
  42.     for(i=0;i<N;i++){
  43.         for(j=0;j<N;j++){
  44.             *(MAT+i*N+j) = rand()%256;
  45.             printf("%d\t",*(MAT+i*N+j));
  46.         }
  47.         printf("\n");
  48.     }
  49.  
  50.     for(i=0;i<N;i++){
  51.         row = (int *)malloc(sizeof(int));
  52.         *row = i;
  53.         pthread_create(tid+i,NULL,th_rt,(void *)row);
  54.     }
  55.  
  56.     for(i=0;i<N;i++)
  57.         pthread_join(tid[i],NULL);
  58.  
  59.     printf("Il Massimo prodotto tra le righe è: %ld\n",MAX);
  60.  
  61.     return 0;
  62. }
  63.  
  64. void *th_rt(void *arg){
  65.     int i,myRow;
  66.     long int prod;
  67.  
  68.     myRow = *(int *)arg;
  69.  
  70.     prod = *(MAT+myRow*N);
  71.     for(i=1;i<N;i++)
  72.         prod *= *(MAT+myRow*N+i);
  73.  
  74.     printf("(%d) Thread : %ld\n",myRow,prod);
  75.  
  76.     pthread_mutex_lock(&mutexMax);
  77.     if(prod > MAX) MAX = prod;
  78.     pthread_mutex_unlock(&mutexMax);
  79.  
  80.     pthread_exit(NULL);
  81.  
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement