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
 
I corsi di Scienze Matematiche Fisiche e Naturali
 
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