Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Clemente Galdi » 25.Esercitazioni sulla sincronizzazione tra thread


Esercizio 1

Scrivere un programma C in cui:

  • Il master thread:
    • Inizializza una variabile globale a=0;
    • crea un thread produttore ed un thread consumatore;
    • In un ciclo infinito visualizza il valore di a.
  • Il Thread produttore:
    • incrementa, ad ogni passola variabile a di due unità e dorme per un secondo.
  • Il Thread consumatore:
    • decrementa la variabile a di una unità e dorme per un secondo.
  • Il processo termina quando a>10.

I thread utilizzano un mutex per la sincronizzazione.

Esercizio 2

Scrivere un programma C che crea 10 thread produttori e 5 thread cosumatori:

  • I thread condividono una variabile intera.
  • Ogni thread produttore incrementa di una unità la variabile condivisa se e solo se il valore della stessa è inferiore a 20.
  • Ogni thread consumatore decrementa di una unità la variabile condivisa se e solo se il valore della stessa è superiore a 5.
  • Tutti i thread, dopo l’operazione sulla variabile condivisa dormono per un secondo.

Utilizzare una condition variable per la sincronizzazione.

Esercizio 3

Scrivere un programma C che crea 5 thread produttori e 5 thread cosumatori:

  • I thread condividono una coda circolare implementata tramite un array di 100 interi.
  • Ogni thread produttore
    • genera cinque numeri casuali (funzione random())
    • Inserisce gli interi in coda
  • Ogni thread consumatore
    • Estrae un elemento dalla coda e lo visualizza.
  • Tutti i thread, dopo l’operazione sulla variabile condivisa dormono per un secondo.

Utilizzare una condition variable per la sincronizzazione.

Esercizio 4

Scrivere un applicazione multi-thread in linguaggio C in cui il master thread:

  • Crea un thread che:
    • esamina ricorsivamente le directory a partire dalla directory corrente;
    • inserisce i nomi di tutti i file regolari in una lista dinamica “elenco” condivisa tra tutti i thread;
    • prima di terminare, pone a 0 la variabile “termina”.
  • Crea 5 thread.
    • Ogni thread riceve come parametro una stringa (ad. Esempio: “thread1″, “thread2″, “thread3″, “thread4″, “thread5″).
    • Se esistono elementi nella lista:
      • Estrae un elemento dalla lista;
      • Apre il file;
      • Legge dal file una riga (si assuma che tutte le righe dei file consistano di esattamente 100 byte);
      • Se la riga contiene la stringa ricevuta come parametro, inserisce il nome del file in una lista “match” condivisa tra tutti i thread.
    • Termina quando la variabile “termina” è pari a 0.

Esercizio 5

La dimensione di un file è pari al numero di byte che occupa su disco.
Definiamo ricorsivamente la “dimensione” di una directory come segue:

  • La dimensione di una directory vuota è pari a zero;
  • La dimensione di una directory che contiene solo file regolari è pari alla somma delle dimensioni dei file regolari;
  • La dimensione di una directory che contiene file e sottodirectory è pari alla somma delle dimensioni dei file regolari e delle dimensioni delle sottodirectory in essa contenute.

Scrivere un’applicazione multi-thread che calcola ricorsivamente la dimensione della directory corrente, con le seguenti modalità:

  • Per ogni sottodirectory viene creato un nuovo thread che calcola la dimensione della sottodirectory ad esso assegnato.

Esercizio 6

Scrivere una applicazione multi-thread in liguaggio C riceve su riga di comando i nomi di due file f1 ed f2:

  • Sia assuma che la dimensione N del file sia un multiplo di 100 byte (N=100 k).
  • Il master thread
    • Apre il file f1 in lettura.
    • Apre il file f2 in scrittura. Se f2 esiste, il suo contenuto viene eliminato.
    • Crea k thread T0,T1,…,Tk-1.
    • Il Thread T1 analizza i byte nel range compreso tra 100i e 100(i+1)-1
      • T0 analizza i byte da 0 a 99;
      • T1 analizza i byte da 100 a 199;
    • Il Thread T1
      • Legge il byte x in posizione j del proprio blocco da f1;
      • Converte x nell’intero y;
      • Scrive y nella posizione j in f2.

Esercizio 7

Scrivere un programma in cui:

  • Il master thread
    • Blocca i segnali SIGUSR1 e SIGUSR2;
    • Apre un file text.txt (utilizzare una variabile globale per il file descriptor);
    • Crea due thread;
    • Invia al proprio PID il segnale SIGUSR1;
    • Attende la terminazione di entrambi I thread.
  • Il thread 0
    • Blocca il segnale SIGUSR1;
    • Si mette in attesa di un segnale.
  • Il thread 1
    • Blocca il segnale SIGURS2;
    • Si mette in attesa di un segnale.
  • L’handler di SIGUSR1 (risp., SIGUSR2):
    • Visualizza Thread_id ed una riga del file;
    • Attende 1 secondo;
    • Invia SIGUSR2 (risp. SIGUSR1) al proprio PID.
  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion