emp3hack

esame-28-02-14 SO

Dec 27th, 2015
297
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Esame del 28/02/14
  2.  * Una ditta che effettua vendite online dei propri prodotti gestisce le richieste di acquisto con un programma multithreading.
  3.  * Questo programma è costituito da un thread che riceve le richieste e attiva, per ognuna di queste,
  4.  * un thread per la gestione della richiesta stessa.
  5.  * Il programma di gestione delle richieste è progettato in modo che abbia le seguenti caratteristiche:
  6.  *
  7.  *  - Non si possono gestire piu` di N richieste contemporaneamente:
  8.  *    se una richiesta arriva mentre nel sistema se ne stanno servendo N la nuova richiesta viene rifiutata
  9.  *    (non rimane in attesa nel sistema);
  10.  *
  11.  *  - Ogni thread di gestione di una richiesta necessita della risorsa R per poter eseguire e tale risorsa
  12.  *        puo' essere acquisita da un thread alla volta;
  13.  *
  14.  *  - Esistono due categorie di richieste, richieste di utenti gold e richieste di utenti silver:
  15.  *    alle richieste di utenti gold viene concesso l’uso della risorsa R con priorita' su quelle degli utenti
  16.  *    silver che attendono fino a quando non ci sono nel sistema thread che servono richieste gold.
  17.  *
  18.  *
  19.  * Scrivere il programma in questione, usando il linguaggio C e la libreria pthread, concentrandosi solo
  20.  * sugli aspetti di sincronizzazione tra i thread e di accesso alle risorse;
  21.  * A tal scopo lasciare indicate in modo generico eventuali altre funzioni svolte dai thread.
  22.  * Generare in modo casuale l’arrivo di richieste segnalandole tramite un semaforo su cui il thread di ricezione
  23.  * si sincronizza.
  24.  */
  25.  
  26. #include <stdio.h>
  27. #include <stdlib.h>
  28. #include <pthread.h>
  29. #include <semaphore.h>
  30.  
  31. #define N 10
  32.  
  33.  
  34. sem_t clienti; // # clienti
  35. sem_t impiegati; // # impiegati liberi
  36.  
  37. typedef struct{
  38.     int priority; // 1 gold, 0 silver
  39.     char* richiesta;
  40. } t_param;
  41.  
  42. pthread_mutex_t m_waiting;
  43. int waiting;
  44.  
  45. sem_t s_priority; // Semaphore used to let silver user wait
  46. int n; // numero di richieste in corso
  47. pthread_mutex_t m_n; // mutex per n
  48.  
  49. int main(int argc, char const *argv[]){
  50.    
  51.     waiting = 0;
  52.  
  53.     return 0;
  54. }
  55.  
  56. void* assegna_lavoro(){
  57.     pthread_t tid;
  58.     while(1){
  59.         deaccoda();
  60.         pthread_create(&tid, NULL, nuovoticket, (void *) &param);  
  61.     }
  62. }
  63.  
  64. void* nuovoticket(){
  65.  
  66.     pthread_mutex_lock(&m_n); // Inizio sez. critica
  67.     if(n >= N){ // Se ci sono già N processi, sblocco mutex ed esco
  68.         pthread_mutex_unlock(&m_n);
  69.         return NULL;
  70.     }
  71.     ++n;
  72.     pthread_mutex_unlock(&m_n); // Fine sez. critica
  73.     if(param->priority == 0) // Aspetto che non ci siano utenti con priorità gold.
  74.         sem_wait(&s_priority);
  75.  
  76.     // LAVORO IL TICKET
  77.    
  78.     pthread_mutex_lock(&m_n); // Inizio sez. critica
  79.     if(param->priority == 1 && n==0) // Se sono l'ultimo gold, rilascio priority così entrano eventuali silver
  80.         sem_post(&s_priority);
  81.     --n;
  82.     pthread_mutex_unlock(&m_n);
  83.  
  84. }
  85.  
  86. // Probelmi:
  87. // Il silver viene mai eseguito?
RAW Paste Data