/* Esame del 28/02/14 * Una ditta che effettua vendite online dei propri prodotti gestisce le richieste di acquisto con un programma multithreading. * Questo programma è costituito da un thread che riceve le richieste e attiva, per ognuna di queste, * un thread per la gestione della richiesta stessa. * Il programma di gestione delle richieste è progettato in modo che abbia le seguenti caratteristiche: * * - Non si possono gestire piu` di N richieste contemporaneamente: * se una richiesta arriva mentre nel sistema se ne stanno servendo N la nuova richiesta viene rifiutata * (non rimane in attesa nel sistema); * * - Ogni thread di gestione di una richiesta necessita della risorsa R per poter eseguire e tale risorsa * puo' essere acquisita da un thread alla volta; * * - Esistono due categorie di richieste, richieste di utenti gold e richieste di utenti silver: * alle richieste di utenti gold viene concesso l’uso della risorsa R con priorita' su quelle degli utenti * silver che attendono fino a quando non ci sono nel sistema thread che servono richieste gold. * * * Scrivere il programma in questione, usando il linguaggio C e la libreria pthread, concentrandosi solo * sugli aspetti di sincronizzazione tra i thread e di accesso alle risorse; * A tal scopo lasciare indicate in modo generico eventuali altre funzioni svolte dai thread. * Generare in modo casuale l’arrivo di richieste segnalandole tramite un semaforo su cui il thread di ricezione * si sincronizza. */ #include #include #include #include #define N 10 sem_t clienti; // # clienti sem_t impiegati; // # impiegati liberi typedef struct{ int priority; // 1 gold, 0 silver char* richiesta; } t_param; pthread_mutex_t m_waiting; int waiting; sem_t s_priority; // Semaphore used to let silver user wait int n; // numero di richieste in corso pthread_mutex_t m_n; // mutex per n int main(int argc, char const *argv[]){ waiting = 0; return 0; } void* assegna_lavoro(){ pthread_t tid; while(1){ deaccoda(); pthread_create(&tid, NULL, nuovoticket, (void *) ¶m); } } void* nuovoticket(){ pthread_mutex_lock(&m_n); // Inizio sez. critica if(n >= N){ // Se ci sono già N processi, sblocco mutex ed esco pthread_mutex_unlock(&m_n); return NULL; } ++n; pthread_mutex_unlock(&m_n); // Fine sez. critica if(param->priority == 0) // Aspetto che non ci siano utenti con priorità gold. sem_wait(&s_priority); // LAVORO IL TICKET pthread_mutex_lock(&m_n); // Inizio sez. critica if(param->priority == 1 && n==0) // Se sono l'ultimo gold, rilascio priority così entrano eventuali silver sem_post(&s_priority); --n; pthread_mutex_unlock(&m_n); } // Probelmi: // Il silver viene mai eseguito?