11.04.2013 Views

Laboratorio di gestione processi

Laboratorio di gestione processi

Laboratorio di gestione processi

SHOW MORE
SHOW LESS

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 = “”).

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!