Sorbonne Université Master 2017 2018
PR : Travaux Dirigés 5. Synchronisation de threads

Cette séance continue à modifier le programme élaboré à la séance Introduction aux processus légers. On trouvera en annexe le Makefile correspondant aux fichiers à créer. Selon les systèmes, il faudra parfois l’utiliser ainsi :

LDFLAGS=’-lpthread’ make but

ou le modifier pour donner systématiquement cette valeur à LDFLAGS.



1 Détachement des threads

On reprend la fonction d’addition de valeurs aléatoires dans sa dernière version avec une Thread d’affichage vue au dernier exercice de la séance précédente. Comment utiliser la fonction pthread_detach pour que les threads affichant leur valeur aléatoire soient détachées après leur création ?

Exemple d'appel :
$PWD/bin/thread_detach 10
Fichier à créer : src/thread_detach.c

2 Détachement à la création

Modifier encore une fois pour que les threads soient dans l’état détaché lors de leur création, grâce à la fonction pthread_attr_setdetachstate.

Exemple d'appel :
$PWD/bin/thread_setdetach 10
Fichier à créer : src/thread_setdetach.c

3 Synchronisation par broadcast

Une barrière est un mécanisme de synchronisation. Elle permet à N threads de prendre rendez-vous en un point donné de leur exécution. Dès que l’une d’entre elles atteint la barrière, elle reste bloquée jusqu’à ce que toutes les autres y arrivent. Lorsque toutes sont arrivées, chacune peut alors reprendre son exécution.

Ecrire une fonction, qu’on nommera wait_barrier prenant en argument un entier N, permettant à N threads de se synchroniser sur une barrière. Testez votre programme avec la thread suivante :

void* thread_func (void *arg) {
   printf ("avant barriere\n");
   wait_barrier (((int *)args)[0]);
   printf ("après barriere\n");
   pthread_exit ( NULL);
}

En exécutant votre programme avec 2 threads, il devra afficher :

avant barrière
avant barrière
après barrière
après barrière

En d’autres termes, on veut que tous les messages « avant barrière » soient affichés avant les messages « après barrière ».

Exemple d'appel :
$PWD/bin/thread_broadcast 10
Fichier à créer : src/thread_broadcast.c

4 Annexes


makefile