Laboratorio di gestione processi
Laboratorio di gestione processi
Laboratorio di gestione processi
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Esempi<br />
<strong>Laboratorio</strong> thread<br />
1) Creazione thread<br />
es1-thread.c<br />
Compila con: cc -o es1 es1-thread.c -lpthread<br />
Il programma attiva 2 thread che scrivono il loro nome e terminano.<br />
2) Scambio messaggi su memoria con<strong>di</strong>visa: un lettore e uno scrittore (non è necessaria mutua<br />
esclusione)<br />
es2-thread.c<br />
Il programma prevede due thread:<br />
• Il thread writer legge da tastiera e pone i dati in una mailbox a 2 posizioni.<br />
• Il reader prende i dati dalla mailbox e li scrive sullo standard output.<br />
Per la sincronizzazione sono utilizzati due semafori:<br />
• empty: buffer <strong>di</strong>sponibile inizializzato a 2<br />
• full: messaggio <strong>di</strong>sponibile inizializzato a 0.<br />
3) Sincronizzazione thread<br />
ppong.c<br />
Il programma attiva 2 thread che scrivono alternativamente ping pong. Per gestire l’alternanza<br />
vengono utilizzati 2 semafori:<br />
• s1: posso scrivere PING<br />
• s2: posso scrivere pong<br />
4) Mutua esclusione<br />
mutex.c<br />
Il programma lancia 2 thread che aggiornano "concorrentemente” una variabile con<strong>di</strong>visa. Per la<br />
mutua esclusione si utilizzano lock e unlock.<br />
5) Operazioni su matrici<br />
add.c<br />
Il programma effettua la somma degli elementi delle righe <strong>di</strong> una matrice 3x3 utilizzando i thread.<br />
Il valore calcolato da ogni thread (uno per ogni riga) viene salvato nella variabile globale Result[]<br />
e quin<strong>di</strong> visualizzato. Il thread “leggi()” si occupa dell’acquisizione dei dati. I thread che<br />
effettuano il calcolo devono attendere su un semaforo che i dati siano <strong>di</strong>sponibili (matrice riempita a<br />
cura del thread “leggi”()).<br />
Esercizi<br />
1) Mo<strong>di</strong>ficare l’applicazione <strong>di</strong> cui al punto 2 (es2-thread.c) in modo da prevedere l’accesso sulla<br />
mailbox da parte <strong>di</strong> più thread (scrittori e lettori) gestendo la mutua esclusione con lock e unlock.<br />
2) Scrivere un programma che preveda 2 thread che aggiornano concorrentemente un array <strong>di</strong> 24<br />
posizioni composto <strong>di</strong> strutture:<br />
struct app {
int libero;<br />
char impegno[20];<br />
}<br />
Un nuovo impegno viene scritto solo se il campo “libero” è a 1.<br />
Prevedere un thread che inizializzi l’array (libero = 1, impegno = “”).