Ecco il testo
codice:
Scrivere un programma C che sfrutti le thread POSIX (Pthread) per effettuare in parallelo la somma
di 12.800 numeri interi casuali. Tali numeri devono essere memorizzati, uno per riga, in un file
passato al programma tramite linea di comando.
Il main deve creare una prima thread di inizializzazione il cui obiettivo consiste nel copiare i numeri
dal file all’interno di 128 array (100 numeri per ogni array), e nell’inizializzare a 0 una variabile
counter.
Il main, attesa la terminazione della thread di inizializzazione, deve creare 128 ulteriori thread T[i],
con 0<= i <128, una per ogni array, il cui obbiettivo consiste innanzitutto nel calcolare la somma
S[i] dei 100 interi memorizzati nel corrispondente array A[i]. Pertanto, dopo la fase di
inizializzazione il programma deve procedere come segue:
1. Ciascuna thread T[i] con 0<= i <128 calcola la somma S[i] degli elementi contenuti
nell’array A[i].
2. Ciascuna thread T[i] con 0<= i <64, rimane attiva e aggiunge a S[i] la somma
S[i+64] eseguita dalla thread T[i+64]. Ad esempio, la thread T[0] somma a S[0] il
valore S[64] calcolato dalla thread T[64], la thread T[1] somma a S[1] il valore
S[65] calcolato dalla thread T[65], etc.
3. Ciascuna thread T[i] con 64<= i <128, termina la propria esecuzione.
4. I passi 2 e 3 devono esser ripetuti considerando questa volta le 64 thread rimaste attive.
Pertanto, ciascuna thread T[i] con 0<= i <32, rimane attiva e aggiunge a S[i] la somma
S[i+32] eseguita dalla thread T[i+32] mentre le thread T[i] con 32<= i <64,
terminano la propria esecuzione.
5. Il passo 4 va ripetuto ricorsivamente, fino a quando rimane una sola thread (la numero 0), che
di conseguenza conterrà la somma totale dei 12.800 numeri iniziali.
Durante i passi 2-5, ciascuna thread deve incrementare di una unità la variabile condivisa counter
ogni volta che viene effettuata una somma. La variabile deve essere modificata dalle thread in modo
mutuamente esclusivo.
Il main attesa la terminazione di tutte le thread dovrà stampare la somma dei 128.000 numeri e il
valore della variabile counter.