Advertisement
nicb

Esercizio Staiano Misto tutte Sincro

Sep 8th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <fcntl.h>
  5. #include <pthread.h>
  6. #include <semaphore.h>
  7.  
  8. //VARIABILI GLOBALI
  9. int **matrice;
  10. int n;
  11. int *array;
  12. int controllo=0;//variabile che utlizzo protetta dal mutex2
  13. sem_t semaforo; //semaforo che nel main viene inizializzato e distrutto
  14.  
  15. //VARIABILI SINCRONIZZAZIONE
  16. pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;   //dichiarazione ed inizializzazione di mutex
  17. pthread_mutex_t mutex2= PTHREAD_MUTEX_INITIALIZER;  //dichiarazione ed inizializzazione di mutex2
  18. pthread_cond_t cond= PTHREAD_COND_INITIALIZER;      //dichiarazione ed inizializzazione di cond (variabile di condizione)
  19.  
  20. //FUNZIONI MATRICE
  21. void riempi_matrice(int **matrice, int n)
  22. {
  23.     int i,j,cont=0;
  24.     for(i=0; i<n;i++)
  25.     {
  26.         for(j=0; j<n; j++)
  27.             matrice[i][j]=++cont;
  28.     }
  29. }
  30. void stampa_matrice (int **matrice, int n)
  31. {
  32.     int i,j;
  33.     for(i=0; i<n;i++)
  34.     {
  35.         for(j=0; j<n; j++)
  36.             printf("\t%d", matrice[i][j]);
  37.         printf("\n\n");
  38.     }
  39. }
  40.  
  41. //FUNZIONI THREAD
  42. void *SommaRighe(void *arg)
  43. {
  44.     int i, somma=0;
  45.     int indice= *(int*)arg;
  46.     for(i=0; i<n; i++)
  47.     {
  48.         somma=somma+matrice[indice][i];
  49.     }
  50.  
  51.     pthread_mutex_lock(&mutex);
  52.         array[indice]=somma;
  53.     pthread_mutex_unlock(&mutex);
  54.     sem_wait(&semaforo);
  55.         controllo++;
  56.     sem_post(&semaforo);
  57.     pthread_mutex_lock(&mutex2);
  58.         if(controllo==n-1)
  59.             pthread_cond_signal(&cond);
  60.     pthread_mutex_unlock(&mutex2);
  61.     pthread_exit(0);
  62. }
  63.  
  64. void *controllore()
  65. {
  66.     int i;
  67.     pthread_mutex_lock(&mutex2);
  68.         if(controllo<n-1)  
  69.             pthread_cond_wait(&cond, &mutex2);
  70.         pthread_mutex_unlock(&mutex2);
  71.     printf("\nArray:");
  72.     for(i=0; i<n; i++)
  73.         printf("\t%d",array[i]);
  74.     pthread_exit(0);
  75.    
  76. }
  77.  
  78.  
  79. //MAIN
  80.  
  81. int main (int argc, char **argv)
  82. {
  83.     //Var locali
  84.     int i;
  85.     pthread_t controllo, *id;
  86.     n=atoi(argv[1]);
  87.  
  88.     //Allocazione dinamica semaforo
  89.     sem_init(&semaforo, 0,1);
  90.  
  91.     //Allocazione dinamica strutture
  92.     matrice= (int**) calloc(n, sizeof(int*));
  93.     for (i=0; i<n; i++)
  94.         matrice[i]= (int*) calloc (n, sizeof(int*));
  95.     riempi_matrice(matrice,n);
  96.     stampa_matrice(matrice,n);
  97.     array=(int*)calloc(n,sizeof(int*));
  98.     id= (pthread_t*)calloc(n, sizeof(pthread_t));
  99.  
  100.     //Nascita thread
  101.     for(i=0; i<n; i++)
  102.     {
  103.         pthread_create(&id[i], NULL, SommaRighe, (void*)&i);
  104.         sleep(1);
  105.     }
  106.     pthread_create(&controllo, NULL, controllore, NULL);
  107.    
  108.     //Attesa fine dei thread nati
  109.     for(i=0; i<n; i++)
  110.         pthread_join(id[i], NULL);
  111.     pthread_join(controllo, NULL);
  112.  
  113.     //Deallocazione dinamica semaforo
  114.     sem_destroy(&semaforo);
  115.    
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement