====== Esercitazione 10 ====== ===== 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. Testare il programma al variare di M ed N. ===== Esercizio 2 ===== Considerare il seguento programma ''dec.c'': #include #include #include #include #define SYSCALL(r,c,e) if((r=c)==-1) { perror(e);exit(errno); } int main(int argc, char *argv[]) { int x,r; if (argc>1) { x = atoi(argv[1]); if (x<0) goto fine; SYSCALL(r, write(1, &x,sizeof(x)),"write1"); } do { SYSCALL(r,read(0, &x,sizeof(x)),"read"); if (r==0) { fprintf(stderr, "Processo %d, esco perche' lo standard input e' chiuso!\n", getpid()); return 0; } fprintf(stderr, "Processo %d, ricevuto %d\n", getpid(),x); --x; if (x<0) break; SYSCALL(r, write(1, &x,sizeof(x)), "write2"); } while(1); fine: fprintf(stderr, "Processo %d, esco perche' raggiunto valore negativo\n", getpid()); return 0; } Scrivere un programma (chiamato //pipedec//) che prende in ingresso un intero positivo. //pipedec// lancia 2 processi figli ognuno dei quali esegue con una chiamata ''exec'' il programma //dec//. Solo ad uno dei due processi figli viene passato come argomento l'intero positivo passato al programma //pipedec//. I due processi figli devono essere connessi tra di loro in modo tale che lo standard input di un processo sia connesso con lo standard output dell'altro processo (la connessione e' quindi bidirezionale).