Skip to content

Latest commit

 

History

History
25 lines (13 loc) · 2.78 KB

readme.md

File metadata and controls

25 lines (13 loc) · 2.78 KB

Esercitazione sul problema dei filosofi a cena e sull'uso delle barriere.

1) Problema dei filosofia cena

Il problema della cena dei filosofi è un classico problema di condivisione delle risorse nella programmazione concorrente. Questo problema è riassunto come segue. Ci sono n filosofiseduti attorno a un tavolo. Ogni filosofo ha davanti a sé un piatto di riso e per mangiare ha bisogno di due bacchette. Ci sono un totale di n bacchette situate a sinistra di ciascun piatto. Un filosofo si comporta in questo modo: pensa, poi se vuole mangiare, prende la bacchetta sinistra, poi prende la bacchetta destra e quando finisce di mangiare restituisce le due bacchette e ricomincia a pensare, e così via. In questo esercizio desideriamo modellare il problema della cena dei filosofi con un programma C in cui ogni bacchetta sarà rappresentata da un lock e ogni filosofo sarà implementato da un thread.

  1. Proponete un implementazione della cena dei filosofi con 5 filosofi. In questa implementazione, ciascun filosofo dovrà dire (stampando sul terminal) il suo stato, ad esempio ’Filosofo 1: sta pensando’, ’Filosofo 1: ha la sua bacchetta sinistra’, ’Filosofo 1: ha la sua bacchetta destra’, ’Filosofo 1: sta mangiando’, ’Filosofo 1: ha rilasciato le sue due bacchette’. Per essere sicuro che il vostra programma finisce, potete supporre che ogni filosofo vorrà mangiare 5 volte.

Consegna: Scriverete questa implementazione in un file philo.c.

  1. Se avete rispettato le indicazione, la vostra implementazione dovrebbe produrre un deadlock dei filosofi. Provate ad esibirlo (usando per esempio dei sleep nel vostro codice).
  2. Proponete una modificazione della vostra implementazione nel modo di evitare il deadlock.

Consegna: Scriverete questa nuova implementazione in un file philo2.c.

2) Barriera

Lo scopo di questo esercizio è di farvi implementare una barriera in C. Scrivete in un header file my_barrier.h la struttura di dati e le prototipe come indicato sotto:

Screen

Vi chiediamo di implementare in un file barrier.c le due funzione pthread_my_barrier_init e pthread_my_barrier_wait e di testarli in un main.

Vi ricordiamo che la barriera blocca i thread che chiamano wait, finche vinit threads hanno fatto questa chiamata, a questo punto la barriera sveglia tutti gli thread in attesa e torna nel suo stato iniziale ad aspettare vinit threads. La funzione pthread_my_barrier_init serve a inizializzare la barriera mettendo il valore v dentro vinit (il valore val della barriera serve a contarre il numero di threads che ha fatto wait fino ad ora). Per questa ultima funziona, se v è uguale a 0, la funzione deve ritornare -1.Ciascun di queste due funzione ritorna 0, se tutto è andato a buon fine,