/* Codice usato per problemi di sincronizzazione dove � necessario gestire un problema di priorit� creando una coda e facendo si che i vip abbiano la precedenza sui clienti nella coda. */ sem_t coda;pthread_mutex_t m_vip_in_coda;int vip_in_coda = 0; sem_t nuovocliente; void* cliente(void* args){ sem_wait(&vip); // Se c'� un vip attendo.. pft sem_wait(&coda);//Faccio la fila //Tocca a me, lascio la coda! sem_post(&coda); sem_post(&nuovocliente);// Segnalo che ci sono }void* vip(void* args){ //Avviso tutti che c'� almeno un vip ;) pthread_mutex_lock(&m_vip_in_coda); vip_in_coda++; if(vip_in_coda == 1) sem_wait(&vip); pthread_mutex_unlock(&m_vip_in_coda); //Avvisati tutti i non vip adesso devono attendere e non entrano in concorrenza con me (che bello essere un vip!) sem_wait(&coda); //Tocca a me! //Libero il posto in coda ed eventualmente se sono l'ultimo VIP avviso tutti che possono provare a entrare pthread_mutex_lock(&m_vip_in_coda); if(vip_in_coda == 0) sem_post(&vip); pthread_mutex_unlock(&vip_in_coda); // Uscito dalla coda vado dove necessario, es gestore: sem_post(&nuovocliente);// Segnalo che ci sono } void* gestore(void * args){ sem_wait(&nuovocliente); }
Comments