[C] Quesito programma semaforo

di il
3 risposte

[C] Quesito programma semaforo

Salve a tutti, avrei un quesito sui semafori da proporvi. Ho una linked list di 8 persone con nome, età e un intero (da 1 a 3, scelto random al momento della creazione) che rappresenta la porta d'ingresso ad una festa, mentre la porta d'uscita è solo una.
Queste persone si accodano all'entrata, quindi dovrò avere 3 code d'attesa per l'entrata ed una sola per l'uscita. Come posso gestire questa situazione utilizzando i semafori?
Grazie in anticipo per l'attenzione e buona giornata.

3 Risposte

  • Re: [C] Quesito programma semaforo

    Immagino, anche se non lo hai scritto, che il problema sia garantire che il numero di persone presenti alla festa non superi mai un certo valore predefinito, giusto?

    Se è così allora ecco come puoi fare:


    1. ognuna delle porte di entrata agirà su un unico semaforo
    2. le operazioni di "entra una nuova persona" sono da mettere nella sezione critica attraverso l'uso di un semaforo
    3. quindi prima di eseguire, per esempio, porta_ingresso_1.entra_una_persona la porta si deve assicurare di avere a disposizione il semaforo. Una volta in possesso del semaforo lo chiude e solo allora incrementa di uno il contatore delle persone presenti, alla fine rilascia il semaforo
    4. visto che la porta di uscita è una sola, puoi decrementare il contare senza la necessità di semafori
  • Re: [C] Quesito programma semaforo

    Il problema è che non so come inizializzare il semaforo, cioè se farne uno unico inizializzato a 3 o 3 semafori inizializzati a uno,tutto questo per la coda d'ingresso. Questa è la struttura del semaforo che ho scritto e successivamente ho definito la funzione wait:
    
    typedef struct{
    	int valore;
    	struct TipoElem *lista;
    }semaforo;
    
    wait (semaforo *s) {
    	s->valore--;
    	if (s->valore < 0){
    
    		block();
    
    	}
    }
    
    Prima della funzione block() dovrei scrivere un pezzo di codice che mi aggiunga il processo a s->lista.
    Spero mi possa aiutare.Grazie e buona giornata
  • Re: [C] Quesito programma semaforo

    Devi usare un solo semaforo ed inizializzarlo a 0.

    Poi le cose dovrebbero svolgersi più o meno così:
    1. il primo thread (relativo alla prima porta di ingresso) impegna il semaforo attraverso una wait e lo decrementa di 1, adesso il semaforo ha valore negativo.
    2. il secondo thread (relativo alla seconda porta di ingresso) tenta la wait sul semaforo, trova il valore negativo e quindi resta bloccato
    3. il terzo thread (relativo alla terza porta di ingresso) tenta la wait sul semaforo, trova il valore negativo e quindi resta bloccato
    4. il primo thread incrementa la variabile condivisa di uno (quella che riporta il numero dei partecipanti alla festa) e rilascia il semaforo (ovvero incrementa il suo valore di uno riportandolo a 0)
    5. il secondo thread si sblocca grazie all'incremento del semaforo, blocca il semaforo, incrementa la variabile condivisa di 1 e sblocca il semaforo

    ... e così via

    Il thread relativo alle uscite se ne frega del semaforo e può decrementare la variabile condivisa quando vuole.

    Per implementare il semaforo puoi usare la libreria POSIX semaphore.h

    Qui trovi diversi esempi



    EDIT: in base all'esempio nel link la tua inizializzazione dovrebbe essere
    sem_init(&mutex, 0, 1);
Devi accedere o registrarti per scrivere nel forum
3 risposte