![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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/1.jpg)
ì
FabioDelVigna- [email protected]
Sistemi operativiCorso di Laurea Triennale in Ingegneria Informatica
Lezione 6• Programmazione concorrente• Thread• Join
![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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/4.jpg)
Sommario
ì Thread POSIXì OperazionisuiThread
ì Creazioneì Terminazioneì Join
FabioDelVigna- [email protected]
![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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/17.jpg)
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 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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/25.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/33.jpg)
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 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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/41.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/42.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/43.jpg)
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 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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/45.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/46.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/47.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/48.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/49.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022071000/5fbca8243cd2a055ba441e41/html5/thumbnails/50.jpg)
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]