Chap5 THREAD
Chap5 THREAD
Chap5 THREAD
1
Systèmes d’Exploitation Avancés
Chapitre 5
2
PLAN
• Théorie de threads
Les processus
Les threads
Différents Threads
• Librairie pthread.h
Création
Terminaison
Attente de la fin d’un thread
Nettoyage à la terminaison
Communication entre Threads
TP
3
Théorie de threads(1)
• Processus unix :
Trois segments :
Le segment texte : code + données statiques
Le segment donnée : variables
Le segment stack : Pile du processus
Un environnement
Information nécessaire au kernel pour gérer
le processus (contenu du processus, priorités,
fichiers ouverts …)
Peut être modifié par un appel système
4
Théorie de threads(2)
Processus :
• Le modèle processus décrit précédemment est un
programme qui s’exécute selon un chemin unique
(compteur ordinal).
5
Théorie de threads(3)
Threads :
De nombreux systèmes d’exploitation modernes offrent la
possibilité d’associer à un même processus plusieurs chemins
d’exécution (multithreading, multiflot d’exécution).
6
Théorie de threads(4)
Threads :
Un thread est une unité d’exécution rattachée à un
processus, chargée d’exécuter une partie du processus.
7
Théorie de threads(5)
Threads :
Chaque thread a :
– un identificateur unique
– une pile d'exécution
– des registres (un compteur ordinal)
– un état…
8
Comment ça marche?
Copie de :
Partage de :
Espace d'adressage
Variables globales
Fichiers ouverts
Signaux
9
Comment ça marche?
Threads :
11
Threads POSIX : Librairie pthread.h
Explication :
pthread_t *tid : ID du thread
const pthread_attr_t *tattr : les attributs du thread
(taille de la pile, priorité….)
void*(*start_routine)(void *) : La fonction à exécuter
void *arg : le paramètre de la fonction
12
Threads POSIX : Librairie pthread.h
Exemple :
#include <pthread.h>
void* thr_f (void* param)
{
int * t = (int *) param;
printf ("parametre : %d % u", *t);
}
int main ()
{int arg=6;
pthread_t thr1;
pthread_create(&thr1,NULL,thr_f, &arg);
return 0;
}
Exercice :
Ecrire un programme qui lance deux thread, l'un affichant
50 fois 1, et l'autre 50 fois 2.
15
Threads POSIX : Librairie pthread.h
Explication :
Suspend l'activité de la thread appelante tant que la
thread tid n'est pas terminée.
status contient la valeur de retour du thread tid lors de sa
terminaison.
16
Threads POSIX : Librairie pthread.h
Explication :
Termine l‘exécution du thread courant avec une valeur de
retour particulière
17
Threads POSIX : Librairie pthread.h
Explication :
Retourne le TID d’un thread.
18
Threads POSIX : Librairie pthread.h
Exemple :
19
Threads POSIX : Librairie pthread.h
Exemple :
// exemple_threads.c
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
void afficher(int n, char lettre)
{
int i,j;
for (j=1; j<n; j++)
{
printf("%c",lettre);
fflush(stdout);
}
}
void *threadA()
{ afficher(100,'A');
printf("\n Fin du thread A\n");
fflush(stdout);
pthread_exit(NULL);
} 20
Threads POSIX : Librairie pthread.h
Exemple :
void *threadC(void *inutilise)
{
afficher(150,'C');
printf("\n Fin du thread C\n");
fflush(stdout);
pthread_exit(NULL);
}
void *threadB(void *inutilise)
{
pthread_t thC;
pthread_create(&thC, NULL, threadC, NULL);
afficher(100,'B');
printf("\n Le thread B attend la fin du thread C\
n");
pthread_join(thC,NULL);
printf("\n Fin du thread B\n");
fflush(stdout);
pthread_exit(NULL);
} 21
Threads POSIX : Librairie pthread.h
Exemple :
int main()
{
int i;
pthread_t thA, thB;
printf("Creation du thread A");
pthread_create(&thA, NULL, threadA, NULL);
pthread_create(&thB, NULL, threadB, NULL);
sleep(1);
//attendre la fin des threads
printf("Le thread principal attend que les autres se
terminent\n");
pthread_join(thA,NULL);
pthread_join(thB,NULL);
exit(0);
}
22
Threads POSIX : Librairie pthread.h
Exemple 2 : Partage de variable
// programme threads.c
#include <unistd.h> //pour sleep
#include <pthread.h>
#include <stdio.h>
int glob=0;
void* decrement(void * x)
{
glob = glob - 1 ;
printf("ici decrement[%u], glob = %d\n",
pthread_self(),glob);
pthread_exit(NULL);
}
void* increment (void * x)
{
sleep(1);
glob = glob + 1;
printf("ici increment[%u], glob = %d\n", pthread_self(),
glob);
pthread_exit(NULL);
} 23
Threads POSIX : Librairie pthread.h
Exemple 2 : Partage de variable
int main( )
{
pthread_t tid1, tid2;
printf("ici main[%d], glob = %d\n", getpid(),glob);
//création d'un thread pour incrément
if ( pthread_create(&tid1, NULL, increment, NULL) != 0)
return -1;
printf("ici main: creation du thread[%u] avec succes\n",tid1);
// creation d'un thread pour decrement
if ( pthread_create(&tid2, NULL, decrement, NULL) != 0)
return -1;
printf("ici main: creation du thread [%u] avec succes\n",tid2);
pthread_join(tid1,NULL); // attendre la fin d’un thread
pthread_join(tid2,NULL);
printf("ici main : fin des threads, glob = %d \n",glob);
return 0;
}
24
Threads POSIX : Librairie pthread.h
Exemple 3 : Passage de paramètres à un thread
// Programme p11.1.cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <pthread.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
using namespace std;
int MAX=5;
inline int gen_alea( int, int );
void *afficher( void * );
25
Threads POSIX : Librairie pthread.h
Exemple 3 : Passage de paramètres à un thread
int main(int argc, char *argv[])
{
pthread_t thread_id[MAX];
int retour;
setvbuf(stdout, (char *) NULL, _IONBF, 0);
if ( argc > MAX+1 ){ // verifier la liste d'arguments
cerr << *argv << " arg1, arg2, ... arg" << MAX << endl;
return 1;
}
cout << "Affichage" << endl;
for (int i = 0; i < argc-1; ++i)
{ // création des threads
if( pthread_create(&thread_id[i],NULL,afficher, (void *)argv[i+1]) > 0)
{
cerr << "Echec a la création des threads" << endl;
return 2;
}
}
26
Threads POSIX : Librairie pthread.h
Exemple 3 : Passage de paramètres à un thread
for (int i=0; i < argc-1; ++i)
{ // attendre les threads
if ( pthread_join(thread_id[i], (void **) retour) > 0){
cerr << "Echec de l’attente des threads" << endl;
return 3;
}
cout << endl << "Thread " << thread_id[i] << " retourne " << retour;
}
cout << endl << "Termine" << endl;
return 0;
// fin de main()
}
27
Threads POSIX : Librairie pthread.h
Thread et mutex :
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
28
Threads POSIX : Librairie pthread.h
Exemple 4 : Thread et mutex
29
Threads POSIX : Librairie pthread.h
Exemple 4 : Thread et mutex
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
30
Threads POSIX : Librairie pthread.h
Exemple 4 : Thread et mutex
31
Threads POSIX : Librairie pthread.h
Exemple 4 : Thread et mutex
32
Threads POSIX : Librairie pthread.h
Exemple 5 : Thread et Sémaphore
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
34
Threads POSIX : Librairie pthread.h
Exemple 5 : Thread et Sémaphore
35
Threads POSIX : Librairie pthread.h
Exercice :
Ecrire un programme contenant deux thread. L'un remplie
un tableau de 100 cases, et l'autre le lit. Dans un premier
temps, le remplissage se fait sans rendre le verrou, et dans
un autre temps, le remplissage est ralenti (sleep) et rend le
verrou.
36
Threads POSIX : Librairie pthread.h
Par défaut :
SCHED OTHER : toutes les threads se partagent le
processeur en fonction de leur priorité.
Hérite de la priorité des parents
Taille de la pile par defaut : 61440
37
Threads POSIX : Librairie pthread.h
Modifier la priorité :
int pthread_attr_setprio(pthread_attr_t *attr_pt, int prio);
Modifier la taille de la pile :
int pthread_attr_setstacksize(pthread_attr_t *attr_pt, long
size);
38
Threads POSIX : Librairie pthread.h
Exercice :
Ecrire un programme qui lance deux thread, l'un affichant
50 fois 1, et l'autre 50 fois 2. Ce coup-ci, le second thread est
prioritaire (priorité= SCHED_FIFO).
39