Entrambe le parti precedenti la revisioneRevisione precedenteProssima revisione | Revisione precedente |
informatica:sol:laboratorio21:esercitazionib:esercitazione7 [06/04/2021 alle 08:54 (4 anni fa)] – Massimo Torquati | informatica:sol:laboratorio21:esercitazionib:esercitazione7 [08/04/2021 alle 08:14 (4 anni fa)] (versione attuale) – [Esercizio 2 (filosofi a cena)] Massimo Torquati |
---|
===== Esercizio 2 (filosofi a cena) ==== | ===== Esercizio 2 (filosofi a cena) ==== |
| |
N filosofi siedono ad una tavola con un piatto di spaghetti davanti ed una forchetta alla loro destra ed una alla loro sinistra. Per mangiare gli spaghetti un filosofo ha bisogno di entrambe le forchette vicine. Ogni filosofo è impegnato ininterrottamente in una sequenza di 3 attivita': meditare, cercare di acquisire le forchette e mangiare. | N filosofi siedono ad una tavola con un piatto di spaghetti davanti ed una forchetta alla loro destra ed una alla loro sinistra. Per mangiare gli spaghetti un filosofo ha bisogno di entrambe le forchette vicine (!). Ogni filosofo è impegnato ininterrottamente in una sequenza di 3 attivita': meditare, cercare di acquisire le forchette e mangiare. |
Scrivere un programma C che attivi N thread filosofi che eseguono il ciclo descritto per 100 volte. La meditazione e la fase in cui il filosofo mangia deve essere implementata con un ritardo variabile (usare ad esempio la chiamata di sistema ''nanosleep'' e la funzione ''rand_r()'').\\ | Scrivere un programma C che attivi N threads filosofi (con N>=5), ognuno dei quali esegue il ciclo descritto in precedenza per 100 volte. La meditazione e la fase in cui il filosofo mangia deve essere implementata con un ritardo variabile usando ad esempio la chiamata di sistema ''nanosleep'' e la funzione ''rand_r()''.\\ |
| SUGGERIMENTO: Per evitare il deadlock nell'aquisizione delle forchette, una possibile soluzione è definire un ordinamento opportuno per l'acquisizione delle forchette da parte di ogni filosofo. |
| |
===== Esercizio 3 (pipeline concorrente) ==== | ===== Esercizio 3 (pipeline concorrente) ==== |
| |
Scrivere un programma C che implementa una //pipeline// di tre threads. Il primo thread legge una riga alla volta da un file testuale (il cui nome e' passato come argomento al programma) ed invia al secondo thread ogni riga letta dal file. Il secondo thread "tokenizza" le parole dalla riga ricevuta dal primo thread (considerare come separatore solo lo spazio) ed invia al terzo thread i le parole. Il terzo thread contralla quali parole sono uniche e alla fine, prima di terminare, stampa tutte le parole uniche individuate (cioe' stampa tulle le parole del file in input che compaiono una sola volta al suo interno). | Scrivere un programma C che implementa una //pipeline// di tre threads. Il primo thread legge una riga alla volta da un file testuale (il cui nome e' passato come argomento al programma) ed invia al secondo thread ogni riga letta dal file. Il secondo thread "tokenizza" le parole dalla riga ricevuta dal primo thread (considerare come separatore solo lo spazio) ed invia al terzo thread le parole. Il terzo thread stampa tutte le parole sullo standard output. |
I tre stadi della pipeline devono lavorare in modo concorrente come in una "catena di montaggio", il buffer di comunicazione tra due stadi della pipeline deve essere implementata con una coda FIFO (la scelta se usare una coda di capacita bounded o unbounded e' lasciata allo studente). | I tre stadi della pipeline devono lavorare in modo concorrente come in una "catena di montaggio", il buffer di comunicazione tra due stadi della pipeline deve essere implementata con una coda FIFO (la scelta se usare una coda di capacita bounded o unbounded e' lasciata allo studente). |
| |
| ===== Esercizio 4 ===== |
| |
| Estendere l'esercizio 3 in modo che il terzo thread della pipeline, invece di stampare tutte le parole ricevute dallo stadio intermedio della pipeline, stampi sullo standard output ogni occorrenza di una parola una sola volta. A tale scopo utilizzare la seguente implementazione di struttura dati {{:informatica:sol:laboratorio21:esercitazionib:icl_hash.tgz|hash}}. |
| |