emp3hack

esame-01-09-14

Dec 27th, 2015
199
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Esame del 01/09/14
  2.  *
  3.  * In una applicazione concorrente k threads condividono r risorse equivalenti dovendo eseguire ognuna una diversa
  4.  * elaborazione che necessita di una istanza delle risorse.
  5.  *
  6.  * Scrivere un programma C che generi ad intervalli casuali i thread di calcolo che non dovranno mai essere piu` di k
  7.  * Ogni thread richiede tramite la funzione Richiesta() l’accesso ad una istanza libera delle r risorse, se ce ne sono.
  8.  * La funzione assegna la risorsa e torna un indice della stessa sotto forma di intero compreso tra 0 e r − 1;
  9.  * La funzione ritorna sempre un valore, aspettando che una risorsa si liberi se non ci sono istanze disponibili.
  10.  *
  11.  * Il generico thread esegue la computazione invocando una funzione il cui prototipo `e void Elabora( int x ),
  12.  * essendo x la risorsa assegnata al thread.
  13.  * Dopo aver fatto uso della istanza della risorsa il thread la rilascia invocando una funzione il cui prototipo
  14.  * e' void Rilascia( int x ), dove x indica l’indice della risorsa da rendere disponibile.
  15.  * Specificare la stuttura del generico thread e le funzioni Richiesta() e Rilascia() in modo tale che
  16.  * ogni istanza di risorsa venga usata da non piu’ di un thread alla volta anche se piu` thread eseguono in modo
  17.  * concorrente.
  18.  *
  19.  * Svolgimento a cura di Emanuele Munafò.
  20.  * Pertanto la soluzione data potrebbe essere inesatta e/o errata.
  21.  */
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <pthread.h>
  26. #include <semaphore.h>
  27. #include <unistd.h>
  28.  
  29. #define K 10
  30. #define R 4
  31.  
  32. sem_t s_nrisorselibere; // Contatore del numero delle risorse libere
  33. pthread_mutex_t m_BMrisorsacondivisa; // Mutex per proteggere la bitmap della risorsa condivisa
  34. short int BMrisorsacondivisa[R]; // Bitmap risorsa condivisa 0: risorsa libera, 1: risorsa occupata
  35. sem_t s_maxthreads;
  36.  
  37. // Prototipi funzioni
  38. unsigned int richiesta();
  39. void rilascia(int x);
  40. void* runner(void* runner);
  41. void* elabora(int x);
  42.  
  43. int main(int argc, char const *argv[]){
  44.     int r;
  45.     pthread_t pid;
  46.     // Inizializzo mutex e semafori
  47.     sem_init(&s_nrisorselibere, 0, R); // Inizialmente tutte le risorse sono libere
  48.     sem_init(&s_maxthreads, 0, K);
  49.     pthread_mutex_init(&m_BMrisorsacondivisa, NULL);
  50.     // Inizializzo la bitmap a 0
  51.     for(int i=0;i<R;++i){
  52.         BMrisorsacondivisa[i] = 0;
  53.     }
  54.     // Inizializzo seme random
  55.     srand(time(NULL));
  56.  
  57.     // Genero sempre thread ma max K
  58.     while(1){
  59.         sem_wait(&s_maxthreads);
  60.         r = rand()%300;
  61.         usleep(r);
  62.         pthread_create(&pid, NULL, runner, NULL);
  63.     }
  64.    
  65.     return 0;
  66. }
  67.  
  68.  
  69. void* runner(void* params){
  70.     unsigned int nr = richiesta(); // Richiedi numero di risorsa libera
  71.     // Lavora sui dati
  72.     elabora(nr); // Elabora i dati, la mutua escusione è implicitamente utilizzata con richiesta() e rilascia()
  73.     // Rilascia le risorse
  74.     rilascia(nr);
  75.  
  76.    
  77. }
  78.  
  79. unsigned int richiesta(){
  80.     sem_wait(&s_nrisorselibere); // Attendo che ci sia almeno una risorsa libera
  81.     unsigned int retvalue = 0;
  82.     pthread_mutex_lock(&m_BMrisorsacondivisa);
  83.     for(int i=0;i<R && (retvalue == 0);++i){ // Break al primo valore 0 che trova
  84.         if(BMrisorsacondivisa[i] == 0) // Ciò significa che l'iesima risorsa è libera
  85.             retvalue = i;
  86.     }
  87.     pthread_mutex_unlock(&m_BMrisorsacondivisa);
  88.     return retvalue;
  89. }
  90.  
  91. void rilascia(int x){
  92.     pthread_mutex_lock(&m_BMrisorsacondivisa);
  93.     BMrisorsacondivisa[x] = 0;
  94.     pthread_mutex_unlock(&m_BMrisorsacondivisa);
  95.     sem_post(&s_nrisorselibere);
  96. }
RAW Paste Data