Thread esercizio

zavo91
non so se è la sezione giusta per parlare di architetture dei calcolatori e sistemi operativi ma non trovando altro credo sia giusta.Comunque ho questo esercizio sui thread
https://docs.google.com/file/d/0BziY2kDqUhJSR0I3RTFnZmVTSUdBaFROT0JNd05OZw/edit
chi mi può spiegare come devo fare per completare le tabelle?

Risposte
apatriarca
E' la sezione corretta. Per vedere l'esercizio mi dice che ho bisogno di richiedere l'accesso al file che non ho abbastanza permessi per accedervi. Se lo rendi pubblico ci rendi un po' tutto più facile. Sarebbe inoltre utile sapere in cosa incontri esattamente difficoltà.

zavo91
adesso dovrebbe andare http://www.mediafire.com/?a6k4rd2i3zxmd68...comunque il mio problema sta nel fatto che non riesco a capire come funzionano questi esercizi....anche perchè dalle soluzioni del mio professore per quel poco che ne so confronto a lui per me sono insensate

hamming_burst
"zavo91":
adesso dovrebbe andare http://www.mediafire.com/?a6k4rd2i3zxmd68...comunque il mio problema sta nel fatto che non riesco a capire come funzionano questi esercizi....anche perchè dalle soluzioni del mio professore per quel poco che ne so confronto a lui per me sono insensate

in pratica il tuo problema è legato solamente all'interpretazione della consegna dell'esercizio, oppure hai dubbi sul comportamente del codice perciò della programmazione concorrente?

zavo91
non saprei come spiegarmi....il mio problema sta nell'interpretare il codice probabilmente visto che non riesco a capire i valori che ha messo il mio professore nelle tabelle

hamming_burst
Riporto, per il momento, il codice per comodità:

init
#define DATA_SIZE 9
#define ARRAY_SIZE 3
#define NUM_BLOCKS DATA_SIZE / ARRAY_SIZE

int A [DATA_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int total = 0;
int percent = 0;
pthread_mutex_t mutex_total = PTHREAD_MUTEX_INITIALIZER;
sem_t sem;

th_fun1
void * th_fun1 (void * arg) {

int i; int sum = 0; int * array = (int *) arg;

	for (i = 0; i < ARRAY_SIZE; i++) {
		sum = sum + array [i]; /* STATEMENT A */
	} /* end for */

	pthread_mutex_lock (&mutex_total);
	total = sum + total; /* STATEMENT B */
	pthread_mutex_unlock (&mutex_total);
	sem_post (&sem); /* STATEMENT C */

} /* end fun1 */

thfun2
void * th_fun2 (void * arg) {

int i = 0; int workers = (int) arg;

	do {
		sem_wait (&sem);
		i++;
		percent = (i * 100) / workers;
	} while (i < workers); /* end do */

} /* end fun2 */

main
int main (int argc, char ** argv) {

int i;
pthread_t ths [NUM_BLOCKS], ths2;
sem_init (&sem, 0, 0);

	for (i = 0; i < NUM_BLOCKS; i++) {
		pthread_create(&ths [i], NULL, th_fun1,(void *) &A [i * NUM_BLOCKS]);
	} /* end for */

	pthread_create (&ths2, NULL, th_fun2, (void *) NUM_BLOCKS);

	for (i = 0; i < NUM_BLOCKS; i++) {
		pthread_join (ths [i], NULL);
	} /* end for */

	pthread_join (ths2, NULL);

} /* end main */

zavo91
qualcuno che mi spieghi come funziona questo tipo di esercizio?

vict85
Comincia a prendere il codice e capire cosa viene fatto in parallelo e come. Dove ci sono le barriere e come funzionano. Se tu che li stai studiando... Comincia a dare le risposte nel caso in cui il codice fosse fatto con un solo thread.

zavo91
già fatto e rifatto questo tanto ma non capisco lo stesso

hamming_burst
Secondo me in questi esercizi serve astrarre e crearsi mentalmente o su carta le strutture in gioco.
In questo caso si tratta di thread perciò sarebbe da disegnare delle scatole con stack e codice, cioè la memoria.

Disegnamolo allora:


Zoom


Vedi se così ti è più chiaro cosa accade, lascio a te risolvere l'esercizio con i valori da inserire, ma ti ho sottolineato dove avviene parallelismo, per risolverlo devi conoscere:
- competizione tra risorse (mutex/mutua esclusione)
- cooperazione tra risorse (sem(0))

zavo91
ok grazie mille ci guardo e vi faccio sapere se avete altri suggerimenti datemeli pure li accetto tutti

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.