Systèmes d'Exploitation II - 2
année Li en e
ème
Travaux Dirigés II : Le Multithreading
ESEN - Université de la Manouba
Amine DHRAIEF
Partie théorique
1. Qu'est e qu'un multithreading ? et quelle est la di(cid:27)éren e ave la multiprogrammation ?
2. Quelles sont les prin ipales similarités/di(cid:27)éren es entre un pro essus et un thread ? Dans
une appli ation qui partage des données en mémoire, faut-il privilégier les pro essus ou
les threads ?
3. Dé rire e qu'est un TCB (Thread Control Blo ) en vous inspirant du ontenu d'un PCB
(Pro ess Control Blo ou en ore un Des ripteur de Pro essus).
4. Considérez les deux mor eaux de ode suivants. Deux threads exé utent respe tivement
les fon tions writer_thread() et reader_thread(), et partagent la variable pointer.
int *pointer = NULL;
void * writer_thread() {
while (1) {
if (pointer == NULL) {
Publicité
pointer = mallo (sizeof(int));
*pointer = rand();
//fon tion dans stdlib.h pour re evoir une valeur aléatoire
}
}
}
void *reader_thread() {
while (1) {
if (pointer != NULL) {
printf("pointer = %d", *pointer);
free(pointer);
pointer = NULL;
}
}
}
(a) En exé utant le programme qui rée deux threads ayant les fon tions pré édentes,
une erreur "Erreur de segmentation" apparaît au bout d'un ertain temps. D'où
provient ette erreur ? Expliquer.
Partie pratique
Publicité
5. La réation et le lan ement du thread se fait par :
pthread_t th1 ;
int ret ;
pthread_ reate (&th1, NULL, runDuThread, "1");
if (th1 == NULL) {
fprintf (stderr, "pthread_ reate error 1") ; exit(0) ;}
Le thread exé utera alors la fon tion runDuThread dont le prototype est :
void runDuthread (void param) ;
Cette fon tion est à é rire par le programmeur pour dé rire le omportement du thread.
Le paramètre param est un pointeur dont la valeur est elle passée en argument (le 4ème)
de la fon tion pthread_ reate. Il permet de passer des données au thread.
Si la fon tion main se termine, le programme et tous les threads lan és se terminent
aussi. Il faut don s'assurer avant de terminer le programme que tous les threads ont (cid:28)ni
leur travail. L'attente de la terminaison d'un thread se fait omme e i :
(void) pthread_join (th1, (void *)&ret) ;
Le paramètre ret ontiendra la valeur retournée par la fon tion pthread_exit(int val)
à exé uter avant de terminer un thread.
(a) É rire un programme qui lan e 2 threads. L'un é rira les 26 minus ules à l'é ran et
l'autre les 26 ma jus ules.
Publicité
(b) É rire un programme qui initialise une variable globale à 0 et rée 2 threads. Cha un
des threads va in rémenter la variable N fois. A(cid:30) her la valeur de la variable à la
(cid:28)n de l'exé ution de ha un des threads.
La suite de Fibona i
6. La suite de Fibona i est une suite d'entiers dans laquelle haque terme est la somme
des deux termes qui le pré èdent : 0, 1, 1, 2, 3, 5, 8. Formellement, on exprime ette
suite omme suit :
fib[0℄=0
fib[1℄=1
fib[n℄=fib[n-1℄+fib[n-2℄
É rire un programme multithreadé qui génère la séquen e de Fibona i. Ce programme
devrait fon tionner omme suit : L'utilisateur saisira le nombre d'éléments de la suite de
Fibona i que le programme devra générer.
Le programme va alors réer un thread séparé qui va générer les nombres de Fibona i,
plaçant la séquen e dans une stru ture de données qui peut être partagées par les (cid:28)ls
(un tableau est probablement la stru ture de données la plus ommode).
Lorsque le thread termine son exé ution, la thread prin ipal a(cid:30) hera le résultat.
Page 2