Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <pthread.h>
- #include <semaphore.h>
- //VARIABILI GLOBALI
- int **matrice;
- int n;
- int *array;
- int controllo=0;//variabile che utlizzo protetta dal mutex2
- sem_t semaforo; //semaforo che nel main viene inizializzato e distrutto
- //VARIABILI SINCRONIZZAZIONE
- pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER; //dichiarazione ed inizializzazione di mutex
- pthread_mutex_t mutex2= PTHREAD_MUTEX_INITIALIZER; //dichiarazione ed inizializzazione di mutex2
- pthread_cond_t cond= PTHREAD_COND_INITIALIZER; //dichiarazione ed inizializzazione di cond (variabile di condizione)
- //FUNZIONI MATRICE
- void riempi_matrice(int **matrice, int n)
- {
- int i,j,cont=0;
- for(i=0; i<n;i++)
- {
- for(j=0; j<n; j++)
- matrice[i][j]=++cont;
- }
- }
- void stampa_matrice (int **matrice, int n)
- {
- int i,j;
- for(i=0; i<n;i++)
- {
- for(j=0; j<n; j++)
- printf("\t%d", matrice[i][j]);
- printf("\n\n");
- }
- }
- //FUNZIONI THREAD
- void *SommaRighe(void *arg)
- {
- int i, somma=0;
- int indice= *(int*)arg;
- for(i=0; i<n; i++)
- {
- somma=somma+matrice[indice][i];
- }
- pthread_mutex_lock(&mutex);
- array[indice]=somma;
- pthread_mutex_unlock(&mutex);
- sem_wait(&semaforo);
- controllo++;
- sem_post(&semaforo);
- pthread_mutex_lock(&mutex2);
- if(controllo==n-1)
- pthread_cond_signal(&cond);
- pthread_mutex_unlock(&mutex2);
- pthread_exit(0);
- }
- void *controllore()
- {
- int i;
- pthread_mutex_lock(&mutex2);
- if(controllo<n-1)
- pthread_cond_wait(&cond, &mutex2);
- pthread_mutex_unlock(&mutex2);
- printf("\nArray:");
- for(i=0; i<n; i++)
- printf("\t%d",array[i]);
- pthread_exit(0);
- }
- //MAIN
- int main (int argc, char **argv)
- {
- //Var locali
- int i;
- pthread_t controllo, *id;
- n=atoi(argv[1]);
- //Allocazione dinamica semaforo
- sem_init(&semaforo, 0,1);
- //Allocazione dinamica strutture
- matrice= (int**) calloc(n, sizeof(int*));
- for (i=0; i<n; i++)
- matrice[i]= (int*) calloc (n, sizeof(int*));
- riempi_matrice(matrice,n);
- stampa_matrice(matrice,n);
- array=(int*)calloc(n,sizeof(int*));
- id= (pthread_t*)calloc(n, sizeof(pthread_t));
- //Nascita thread
- for(i=0; i<n; i++)
- {
- pthread_create(&id[i], NULL, SommaRighe, (void*)&i);
- sleep(1);
- }
- pthread_create(&controllo, NULL, controllore, NULL);
- //Attesa fine dei thread nati
- for(i=0; i<n; i++)
- pthread_join(id[i], NULL);
- pthread_join(controllo, NULL);
- //Deallocazione dinamica semaforo
- sem_destroy(&semaforo);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement