Université Pierre et Marie Curie Master 2016 2017
PR : Travaux sur Machine 4. 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

En utilisant la fonction pthread_detach, modifier le programme précédent pour que les threads affichant la 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
Format de l'envoi : src/thread_detach.c
Répertoires autorisés : src/thread_setdetach.c src/thread_broadcast.c