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.
Scrivere una versione concorrente del programma dell'Assegnamento3 Es.6 (My Word Count – versione semplificata del programma wc
). Dovra' essere aggiunto un ulteriore parametro -t <numthreads> 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.