====== Esercitazione 8 ====== ===== Esercizio 1 ===== Scrivere un programma C in cui si attivano M thread produttori ed N thread consumatori che condividono una coda (di lunghezza "infinita"). Il programma accetta come argomento anche un intero K che corrisponde al numero totale di messaggi che i produttori producono concorrentemente nella coda (ogni produttore produce K/M messaggi se M divide K). I consumatori leggono i messaggi dalla coda in un ciclo infinito fino a quando non ricevono un messaggio speciale che li fa terminare. Implementare la coda concorrente, ed il protocollo di terminazione senza usare la cancellazione esplicita dei threads. ===== Esercizio 2 ===== Scrivere una versione concorrente del programma dell'[[informatica:sol:laboratorio17:esercitazionib:esercitazione3|Assegnamento3]] Es.6 (My Word Count -- versione semplificata del programma ''wc''). Dovra' essere aggiunto un ulteriore parametro //-t // al programma, che specifica il numero di thread "Workers" da utilizzare per eseguire i calcoli. Ogni thread preleva da una coda condivisa in ingresso (//inQ//) il nome del file da esaminare e scrive in una coda condivisa di uscita (//outQ//) il risultato da produrre (cioe' il numero di linee e/o il numero di parole contenute nel file). Il thread main (che fa da "Master" thread) inserisce i nomi dei file da esaminare in //inQ// ed estrae i risultati da //outQ// provvedendo alla loro visualizzazione sullo standard output. I threads Workers termineranno la loro esecuzione se prelevano dalla coda //inQ// un opportuno messaggio. Testare con ''valgrind'' che non ci siano memory-leaks all'uscita del programma.