sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/lezione_6.pdf · processo...

50
ì Fabio Del Vigna - [email protected] Sistemi operativi Corso di Laurea Triennale in Ingegneria Informatica Lezione 6 Programmazione concorrente Thread Join

Upload: others

Post on 16-Aug-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

ì

FabioDelVigna- [email protected]

Sistemi operativiCorso di Laurea Triennale in Ingegneria Informatica

Lezione 6• Programmazione concorrente• Thread• Join

Page 2: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Domande sulle lezioni passate?

FabioDelVigna- [email protected]

Page 3: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Soluzioni degli esercizi

§ È importante osservare l'utilizzo della CPU. Visto che il programma gira sempre *solo* in spazio utente, la percentuale 'user' va al 100%. Cambiando il nice level, oltre a cambiare il numero nella colonna nice, il consumo di CPU si sposta nel campo nice.

§ In questo caso il programma invoca continuamente una syscall, quindi gira anche in modalità kernel. La percentuale di CPU 'system' non raggiunge il 100% perche' comunque il programma in parte gira *anche* in spazio utente (gestione del ciclo).

§ In questo caso il processo passa dallo stato run (quando esegue il ciclo interno) allo stato sleep (quando è bloccato in attesa del timer, per effetto della chiamata sleep()). È interessante notare il livello di priorità: questo cresce quando il processo è sleeping, mentre decresce quando il processo usa la CPU, cioè durante il ciclo for. Questo perchè UNIX decrementa la priorità dei processi che stanno usando molta CPU, e viceversa (politica anti-starvation).

FabioDelVigna- [email protected]

Page 4: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Sommario

ì Thread POSIXì OperazionisuiThread

ì Creazioneì Terminazioneì Join

FabioDelVigna- [email protected]

Page 5: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

ì

FabioDelVigna- [email protected]

Thread POSIXAspettipreliminari

Page 6: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Processo vs Thread (1 di 2)

§ Processo :èl’unitàdicondivisionedellerisorsealcunedellequalipossonoessereinizialmenteereditatedalpadre.§ Ogniprocessoha:

ð spaziodiindirizzamentoprivatoð stackð heap.

§ Dueprocessinoncondividonomailospaziodiindirizzamento

§ Thread :èunflussodiesecuzione indipendente checondividetutte lesuerisorse,inclusolospaziodiindirizzamento,conaltrithread

FabioDelVigna- [email protected]

Page 7: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Processo vs Thread (2 di 2)

§ Ithread eseguonosumemoriacondivisanell’ambitodellostessoprocesso.Quandounthread vienecreatocondivideilsuospaziodimemoriaconglialtri thread chefannopartedelprocesso

§ Sonoanchechiamatilightweightprocess oprocessileggeri perchépossiedonouncontestopiùsnellorispettoaiprocessi

FabioDelVigna- [email protected]

Page 8: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Thread

§ Thread§ èl’unitàgranulareincuiunprocessopuòesseresuddivisoechepuòessere

eseguitoinparalleloadaltrithread§ èpartedelprocessoevieneeseguitoinmanieraconcorrente edindipendente,

internamentealprocessostesso

§ insiemediistruzionichevengonoeseguiteinmodoindipendenterispettoalmain

§ Statodiunthread§ stack§ registri

§ proprietàdischeduling§ statodeisegnali§ datiprivati

FabioDelVigna- [email protected]

Page 9: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio di utilizzo dei thread

§ BrowserWeb,puòusareunthread distintoperscaricareogniimmagineinunapaginaWeb.

§ Processiserverchepossonorisponderecontemporaneamente allerichiesteprovenientidapiùutenti.

FabioDelVigna- [email protected]

Page 10: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Vantaggi :-)

§ Visibilitàdeidatiglobali§ condivisionedioggettisemplificata.

§ Piùflussidiesecuzione.§ Comunicazioniveloci

§ Tuttiithread diunprocessocondividonolostessospaziodiindirizzamento,quindilecomunicazionitrathread sonopiùsemplicidellecomunicazionitraprocessi.

§ Context switch veloce§ Nelpassaggiodaunthread adunaltrodiunostesso

processovienemantenutabuonapartedell’ambiente.

FabioDelVigna- [email protected]

Page 11: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Svantaggi :-(

§ Concorrenzainvecediparallelismo§ Bisognagestirelamutuaesclusione

§ Ithread diunprogrammausanoilsistemaoperativomediantesystem callcheusanodatietabelledisistemadedicatealprocesso.§ Lesyscall devonoesserecostruiteinmododapoteressere

utilizzatedapiùthread contemporaneamente.Adesempiolafunzionechar *inet_ntoa()scriveilpropriorisultatoinunavariabiledisistema(delprocesso)erestituiscealchiamanteunpuntatoreatalevariabile.Seduethread diunostessoprocessoeseguono“nellostessoistante”lachiamataadueinet_ntoa()ognunosettalavariabileconunvalore.

§ Ilcodiceinvocabiledathread concorrentisenzarischièdetto“thread safe”

FabioDelVigna- [email protected]

Page 12: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Standard

§ StandardANSI/IEEE POSIX1003.1(1990)§ Lostandardspecifical’interfacciadiprogrammazione(ApplicationProgramInterface- API)deithread.

§ Ithread POSIXsononoticomePthread.

FabioDelVigna- [email protected]

Page 13: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Funzioni delle API per Pthread

§ LeAPIperPthread distinguonolefunzioniin3gruppi:§ Thread management

ð funzionipercreare,eliminare,attenderelafinedeipthread

§ Mutexes:

ð funzionipersupportareuntipodisincronizzazionesemplicechiamata“mutex”(mutuaesclusione).

ð funzionipercreareedeliminarelastrutturaperlamutuaesclusionediunarisorsa,acquisireerilasciaretalerisorsa.

§ Condition variables:

ð funzioniasupportodiunasincronizzazionepiùcomplessa,dipendentedalvaloredivariabili,secondoimodidefinitedalprogrammatore.

ð funzionipercreareedeliminarelastrutturaperlasincronizzazione,perattendereesegnalarelemodifichedellevariabili.

FabioDelVigna- [email protected]

Page 14: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Utilizzo

§ includerel’header dellalibreriachecontieneledefinizionideipthread

#include <pthread.h>ð Perinterpretarecorrettamenteimessaggidierroreè

necessarioancheincluderel’header <errno.h>§ compilarespecificandolalibreria

gcc <opzioni> -lpthreadð Libreria pthread (libpthread)àlpthread

ð Perulterioriinformazionisullacompilazionefareriferimentoalladocumentazionedellapiattaformautilizzataman pthread o man pthreads

FabioDelVigna- [email protected]

Page 15: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Convenzione sui nomi delle funzioni

§ GliidentificatoridellalibreriadeiPthread inizianoconpthread_§ pthread_

ð indicalagestionedeithread ingenerale§ pthread_attr_

ð funzioni pergestireproprietàdeithread§ pthread_mutex_

ð gestionedellamutuaesclusione§ pthread_mutexattr_

ð proprietàdellestruttureperlamutuaesclusione§ pthread_cond_

ð gestionedellevariabilidicondizione§ pthread_condattr_

ð proprietàdellevariabilidicondizione§ pthread_key_

ð datispecialideithread

FabioDelVigna- [email protected]

Page 16: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Risorse (1 di 2)

§ POSIXThreads ProgrammingTutorial§ http://www.llnl.gov/computing/tutorials/pthreads/

§ Libri(consultazione)§ B.Lewis,D.Berg,“Threads Primer”,Prentice Hall§ D.Butenhof,“ProgrammingWithPOSIXThreads”,AddisonWesley

§ B.Nichols etal,“Pthreads Programming”,O’Reilly

FabioDelVigna- [email protected]

Page 17: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Risorse (2 di 2)

§ Manpages§ pacchettomanpages-posix-dev (Debian)

§ man pthread.h

§ man <nomefunzione>

§ ManualeGNUlibc§ http://www.gnu.org/software/libc/manual/html_node/POSIX-Threads.html

FabioDelVigna- [email protected]

Page 18: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Gestione dei thread

FabioDelVigna- [email protected]

Page 19: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Tipi definiti nella libreria pthread

§ All’interno di un programma un thread è rappresentato da un identificatore§ tipo opaco pthread_t

§ Attributi di un thread§ tipo opaco pthread_attr_t

ì tipo opaco: si definiscono così strutture ed altri oggetti usati da una libreria, la cui struttura interna non deve essere vista dal programma chiamante (da cui il nome) che li deve utilizzare solo attraverso dalle opportune funzioni di gestione.

FabioDelVigna- [email protected]

Page 20: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Identificatore del thread

§ Processo:process id(pid)pid_t

§ Thread:threadid(tid)pthread_t

§ Restituisce il tid delthreadchiamante

FabioDelVigna- [email protected]

pthread_t pthread_self( void )

Page 21: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Confronto tra thread

§ confrontaidueidentificatoridithread.§ 1 seidueidentificatorisonouguali

FabioDelVigna- [email protected]

int pthread_equal( pthread_t t1, pthread_t t2 )

Page 22: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Creazione di un thread (1 di 2)

ì creaunathread elorendeeseguibile,cioèlometteadisposizionedelloscheduler perfarlopartire().

FabioDelVigna- [email protected]

int pthread_create( pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine)(void *),void *arg )

Non è prevedibileil momento dell'attivazione

del thread

Page 23: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Creazione di un thread (2 di 2)

§ pthread_t *thread

§ puntatoreadunidentificatoredithread incuiverràscrittol’identificatoreunivocodelthread creato(secreatoconsuccesso)

§ const pthread_attr_t *attr

§ attributidelprocessodacreare:puòindicarelecaratteristichedelthread riguardoalleoperazionidijoinoalloscheduling

§ seNULL usavalorididefault§ void *(*start_routine)(void *)

§ èilnome(indirizzo)dellafunzionedaeseguireallacreazionedelthread§ void *arg

§ puntatorechevienepassatocomeargomentoastart_routine.§ Valore diritorno

§ 0 inassenzadierrore

§ diversodazeroaltrimenti(attributierrati,mancanzadirisorse)

FabioDelVigna- [email protected]

Page 24: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Terminazione di un thread

§ Terminal’esecuzionedelthread dacuivienechiamata§ Ilsistemaliberalerisorseallocatealthread.§ Seilmain terminaprimacheithread daluicreatisiano

terminatienonchiamalafunzione pthread_exit,alloratuttiithread sonoterminati. Seinveceilmain chiamapthread_exit alloraithread possonocontinuareaviverefinoallaloroterminazione.

§ void *value_ptr§ valorediritornodelthread consultabiledaaltrithread

attraversolafunzionepthread_join

FabioDelVigna- [email protected]

void pthread_exit( void *value_ptr )

Page 25: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 1: creazione e terminazione (1 di 2)

FabioDelVigna- [email protected]

/* Include */

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#define NUM_THREADS 5

/* Corpo del thread */

void *PrintHello(void * num) {

printf(”\n%d: Hello World!\n”, num);

pthread_exit(NULL);

}

Page 26: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 1: creazione e terminazione (2 di 2)

FabioDelVigna- [email protected]

/* Programma */

int main (int argc, char *argv[])

{

pthread_t threads[NUM_THREADS];

int rc, t;

for(t=0; t<NUM_THREADS; t++){

printf("Creating thread %d\n", t);

rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);

if (rc){

printf("ERROR; return code from pthread_create() is %d\n", rc);

exit(-1);

}

}

pthread_exit(NULL);

}

Page 27: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Passaggio parametri (1 di 3)

§ Lapthread_create prevedeunpuntatoreperilpassaggiodeiparametrialthread nelmomento incuicomincial’esecuzione.

§ Sipongaattenzionenelcasoilthread debbamodificareiparametri,oppureilchiamantedebbamodificareiparametri,potrebbero insorgereproblemi,megliodedicareunastrutturadatiadhoc,perilpassaggio.

FabioDelVigna- [email protected]

Page 28: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Passaggio parametri (2 di 3)

§ Perriferimentoconuncastavoid*§ Esempio(errato)

§ ilciclomodificailcontenutodell’indirizzopassatocomeparametro

FabioDelVigna- [email protected]

int rc, t;

for(t=0; t<NUM_THREADS; t++) {

printf("Creating thread %d\n", t);

rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);

...

}

Page 29: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Passaggio parametri (3 di 3)

§ Esempio(corretto)§ strutturadatiunivocaperognithread

FabioDelVigna- [email protected]

int *taskids[NUM_THREADS];

for(t=0; t<NUM_THREADS; t++){

taskids[t] = (int *) malloc(sizeof(int));

*taskids[t] = t;

printf("Creating thread %d\n", t);

rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t]);

...

}

Page 30: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 2 errato: passaggio parametri (1 di 2)

FabioDelVigna- [email protected]

/* Include */

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#define NUM_THREADS 5

/* Corpo del thread */

void *PrintHello(void *num) {

printf("\n%d: Hello World!\n", *(int *) num);

pthread_exit(NULL);

}

Page 31: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 2 errato : passaggio parametri (2 di 2)

FabioDelVigna- [email protected]

/* Programma */

int main (int argc, char *argv[])

{

pthread_t threads[NUM_THREADS];

int rc, t;

for(t=0; t<NUM_THREADS; t++) {

printf("Creating thread %d\n", t);

rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);

if (rc){

printf("ERROR; return code from pthread_create() is %d\n", rc);

exit(-1);

}

}

pthread_exit(NULL);

}

Page 32: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 2 : passaggio parametri (1 di 2)

FabioDelVigna- [email protected]

/* Include */

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#define NUM_THREADS 5

/* Corpo del thread */

void *PrintHello(void *num) {

printf("\n%d: Hello World!\n", *(int *) num);

pthread_exit(NULL);

}

Page 33: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 2 : passaggio parametri (2 di 2)

FabioDelVigna- [email protected]

/* Programma */

int main (int argc, char *argv[])

{

pthread_t threads[NUM_THREADS];

int rc, t;

int *taskids[NUM_THREADS];

for(t=0; t<NUM_THREADS; t++){

taskids[t] = (int *) malloc(sizeof(int));

*taskids[t] = t;

printf("Creating thread %d\n", t);

rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t] );

if (rc){

printf("ERROR; return code from pthread_create() is %d\n", rc);

exit(-1);

}

}

pthread_exit(NULL);

}

Page 34: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Sincronizzazione(semplice)

FabioDelVigna- [email protected]

Page 35: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Join tra thread

§ Formaelementare disincronizzazione§ ilthread cheeffettuailjoinsibloccafinchéunospecificothread nontermina

§ ilthread cheeffettuailjoinpuòottenerelostatodelthread chetermina

§ Attributodetachstate diunthread§ specificasesipuòinvocareonolafunzione joinsuuncertothread

§ unthread èjoinable perdefault

FabioDelVigna- [email protected]

Page 36: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Operazione di join

§ pthread_t *thread§ identificatoredelthread dicuiattenderelaterminazione

§ void **value§ valorerestituitodalthread chetermina

§ Valore diritorno§ 0 incasodisuccesso§ EINVAL seilthread daattenderenonèjoinable§ ERSCH senonèstatotrovatonessunthread

corrispondenteall’identificatorespecificato

FabioDelVigna- [email protected]

int pthread_join( pthread_t *thread, void **value )

Page 37: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Impostazione attributo di join (1 di 4)

ì Inizializzagliattributidelpthread

ì Dealloca gliattributidelpthread

FabioDelVigna- [email protected]

int pthread_attr_init( pthread_attr_t *attr )

int pthread_attr_destroy ( pthread_attr_t *attr)

Page 38: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Impostazione attributo di join (2 di 4)

§ Un thread può essere:§ Joinable: i thread non sono rilasciati automaticamente ma

rimangono come zombie finchè altri thread non effettuano delle join

§ Detached: i thread detached sono rilasciati automaticamente e non possono essere oggetto di join da parte di altri thread.

§ Detach può essere:§ PTHREAD_CREATE_DETACHED§ PTHREAD_CREATE_JOINABLE.

FabioDelVigna- [email protected]

int pthread_attr_setdetachstate( pthread_attr_t *attr, int detachstate )

Page 39: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Impostazione attributo di join (3 di 4)

FabioDelVigna- [email protected]

/* Attributo */

pthread_attr_t attr;

/* Inizializzazione esplicita dello stato joinable */

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

...

pthread_attr_destroy(&attr);

Page 40: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Impostazione attributo di join (4 di 4)

FabioDelVigna- [email protected]

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

pthread_t thread[NUM_THREADS];

...

pthread_attr_destroy(&attr);

for(t=0; t<NUM_THREADS; t++)

{

rc = pthread_join(thread[t], (void **)&status);

if (rc) {

printf("ERROR; return code from pthread_join() is %d\n", rc);

exit(-1);

}

printf("Completed join with thread %d status= %d\n",t, status);

}

pthread_exit(NULL);

}

Page 41: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 3: thread join (1 di 3)

FabioDelVigna- [email protected]

/* Include */#include <pthread.h>#include <stdio.h>#include <stdlib.h>#define NUM_THREADS 5

void *PrintHello(void *num) {printf("\n%d: Hello World!\n", num);pthread_exit(NULL);

}

Page 42: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 3: thread join (2 di 3)

FabioDelVigna- [email protected]

int main (int argc, char *argv[]) {pthread_t threads[NUM_THREADS];void *status;int rc, t;pthread_attr_t attr;

/* Inizializzazione esplicita dello stato joinable */pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

for(t=0; t<NUM_THREADS; t++){printf("Creating thread %d\n", t);rc = pthread_create(&threads[t], &attr, PrintHello, (void *)t);if (rc){

printf("ERROR; return code from pthread_create() is %d\n", rc);exit(-1);

}}

Page 43: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esempio 3: thread join (3 di 3)

FabioDelVigna- [email protected]

for(t=0; t<NUM_THREADS; t++){rc = pthread_join(threads[t], (void **)&status);if (rc) {

printf("ERROR; return code from pthread_join() is %d\n", rc);exit(-1);

}printf("Completed join with thread %d status= %d\n",t, status);

}

printf ("Main(): Atteso su %d threads. Fatto \n", NUM_THREADS);

/*Rimuovi oggetti ed esci*/pthread_attr_destroy(&attr);

pthread_exit(NULL);}

Page 44: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esercizi

FabioDelVigna- [email protected]

Page 45: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esercizio 1

§ pthreads-1a-simple.c§ analizzarel'output§ cambiarepthreads_exit(NULL) inreturn(0)

§ cosasuccede?§ aggiungereilpassaggiodiunparametroaithreadpassandoatuttilostessovalore

§ pthreads-1b-simple.c§ cosacambiarispettoalprecedente?

§ pthreads-1c-simple.c§ soluzionedell'esercizioprecedente(prossimavolta)

FabioDelVigna- [email protected]

Page 46: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

pthreads-1a-simple.c

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>

#define NUM_THREADS 3

void *thread_function(void* arg){printf("[Thread] Waiting for termination...\n");sleep(5);printf("[Thread] ...thread finished!\n");pthread_exit(NULL);

}

int main(void){pthread_t tids[NUM_THREADS];int i, rc;printf("[Main] Starting...\n");for (i=0; i<NUM_THREADS; i++) {printf("[Main] Creating thread %d..\n", i); rc = pthread_create(&tids[i], NULL, thread_function, NULL);if (rc) {perror("[Main] ERROR from pthread_create()\n");exit(-1);

}}printf("[Main] ...done!\n");pthread_exit(NULL);

}

FabioDelVigna- [email protected]

Page 47: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

pthreads-1b-simple.c (1 di 2)

#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>

#define NUM_THREADS 3

void *thread_function(void* arg){printf("[Thread] Waiting for

termination...\n");sleep(5);printf("[Thread] ...thread finished!\n");pthread_exit(NULL);

}

FabioDelVigna- [email protected]

Page 48: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

pthreads-1b-simple.c (2 di 2)int main(void){pthread_t tids[NUM_THREADS];int i, rc;printf("[Main] Starting...\n");for (i=0; i<NUM_THREADS; i++) {printf("[Main] Creating thread %d..\n", i);rc = pthread_create(&tids[i], NULL, thread_function, (void*)NULL);if (rc) {perror("[Main] ERROR from pthread_create()\n");exit(-1);

}}printf("[Main] Waiting for threads termination...\n"); for(i=0; i<NUM_THREADS; i++) {

rc = pthread_join(tids[i], (void *)NULL);if (rc) {

perror("[Main] ERROR from pthread_join()\n");exit(-1);

}printf("[Main] Completed join with thread %d\n",i);

}printf("[Main] ...done!\n");return(0);

}

FabioDelVigna- [email protected]

Page 49: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

Esercizio 2

§ pthreads-2a-args.c

§ analizzarel'output§ modificareinmododaottenereunfunzionamentocorretto

§ pthreads-2b-args.c

§ soluzionedell'esercizioprecedente(prossimavolta)

FabioDelVigna- [email protected]

Page 50: Sistemioperativi ì - unipi.itfor.unipi.it/fabio_del_vigna/files/2014/10/Lezione_6.pdf · Processo vs Thread (1 di 2) § Processo: è l’unità di condivisione delle risorse alcune

pthreads-2a-args.c#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <unistd.h>

#define NUM_THREADS 3

void *thread_function(void* arg){int i = *(int*)arg;printf("[Thread %d] Waiting for termination...\n",i);sleep(5);printf("[Thread %d] ...thread finished!\n",i);pthread_exit(NULL);

}

int main(void){pthread_t tids[NUM_THREADS];int i, rc;printf("[Main] Starting...\n");for (i=0; i<NUM_THREADS; i++) {printf("[Main] Creating thread %d..\n", i); rc = pthread_create(&tids[i], NULL, thread_function, (void*)&i);if (rc){perror("[Main] ERROR from pthread_create()\n");exit(-1);

}}printf("[Main] ...done!\n");pthread_exit(NULL);

}

FabioDelVigna- [email protected]