Semafori POSIX

Semafori POSIX

I semafori POSIX sono semafori contatori che permettono di gestire la sincronizzazione dei thread POSIX.

Esistono altri meccanismi che, per mancanza di tempo, menzionano solamente:

sem_init, sem_wait e sem_post

sem_getvalue e sem_destroy

 

NOTA: su MacOS si devono usare i semafori con nome (vedere le dispense per maggiori dettagli)

Esercizio 1: sezione critica

Riprendiamo l’ultimo esercizio della volta scorsa: Creare 2 thread che aggiornano ripetutamente (in un ciclo for) una variabile condivisa count per un numero elevato di volte (ad esempio 1000000). Stampare il valore finale per osservare eventuali incrementi perduti…

for (j=0;j<MAX;j++) {
    count++
}

(Seguiva una nota sulle ottimizzazioni del compilatore. Vedere le dispense della volta scorsa per maggiori dettagli)

Aggiungere un semaforo mutex per risolvere le interferenze. Notare l’esecuzione corretta al prezzo di una più bassa performance.

Esercizio 2: attesa tra 2 thread

Realizzare la sincronizzazione tra 2 thread vista a lezione in cui T2, prima di eseguire la porzione di codice < D > deve attendere che T1 abbia eseguito il codice < A >.

void * T1(void * j) {
	sleep(3);
	printf("Eseguito < A >\n");

	sleep(3);
	printf("Eseguito < B >\n");
}

void * T2(void * j) {
	printf("Eseguito < C >\n");

	printf("Eseguito < D >\n");
}

Esercizio 3: Produttore/Consumatore

  1. Implementare il Produttore-Consumatore con buffer circolare visto a lezione, utilizzando due semafori contatori più un mutex;
  2. Testarlo in presenza di più produttori e più consumatori, verificando che la presenza del mutex è fondamentale per la coerenza dei dati.

 

NOTA: non pubblico la soluzione di questo esercizio, provate da soli e mandate le vostre idee, commenti, tentativi, etc. su slack in modo che possiamo discuterne assieme!

Fate attenzione che …