TP 3 - Threads - On the road
Comme le nom du TP l’indique, vous allez créer des threads. L’objectif est de faire avancer des voitures le long d’une route, un thread par voiture.
Vous pouvez télécharger une version PDF de ce sujet.
Attendu
Vous avez deux séances pour réaliser ce TP.
-
OS_NomA_NomB-
TPThreadRoad-
.gitignore(avec tout ce qui n’est pas attendu) -
Makefile -
onTheRoad.c -
onTheRoad2.c -
onTheRoad3.c
-
-
Ce qui n’est pas poussé sur votre dépôt GitLab n’est pas corrigé.
Pensez donc bien à effectuer des commit et des push régulièrement.
Il est souhaitable de créer également un .gitignore à la racine du
répertoire de vos TPs, OS_NomA_NomB, qui contiendra au moins une ligne: *.o
Ce qui est fourni
Pour les prochains TPs, vous allez utiliser une bibliothèque dédiée
libroad. Commencez par consulter la page qui
lui est dédiée.
Vous trouverez également une documentation succincte sur les threads dans le document intitulé : "Unix : quelques fonctions système".
L’objectif du TP est de faire avancer plusieurs voitures dans des threads autonomes.
1. Mise en place - Makefile
Cette étape n’est pas triviale et fait partie des exercices du TP.
1.1. Compilation
À l’aide des indications données dans la page de libroad,
vérifiez que vous arrivez à compiler et exécuter le programme d’exemple.
1.2. Exécution
N’oubliez pas de mettre à jour votre LD_LIBRARY_PATH comme indiqué dans la
page de libroad pour pouvoir exécuter le programme.
2. Création d’un thread
Dans l’état actuel du programme, la voiture avance à chaque passage dans la
boucle principale grâce à la fonction road_stepCar. Pour découpler l’avancée
de la voiture de cette boucle principale, vous allez créer un thread pour gérer
la voiture.
2.1. Start routine
Pour pouvoir gérer la voiture dans un thread, vous aurez besoin de créer une
fonction qui sera passée à pthread_create. Cette fonction est le paramètre
start_routine de la fonction pthread_create.
Donner à cette fonction un nom pertinent, par exemple "car_thread".
Pour pouvoir être passée à pthread_create, cette fonction doit avoir la
signature suivante:
void* car_thread(void* param);
Cette fonction est en charge de rajouter la voiture à la route et de la faire avancer.
Avant de passer à la suite, assurez-vous que vous arrivez à :
-
afficher une voiture,
-
la faire avancer.
Il faudra notamment s’assurer que road_stepCar est appelée plusieurs fois.
Veillez également à utiliser judicieusement usleep pour pouvoir la voir
passer.
Pour pouvoir utiliser les threads, il vous faudra utiliser le flag quivabien® à l’édition de lien.
2.2. Terminer le thread proprement
Avant de réaliser cette étape, votre voiture devra traverser la fenêtre jusqu’à disparaître.
Vous allez maintenant faire en sorte que le thread qui fait avancer la voiture
se termine proprement c’est-à-dire que la fonction exécutée dans le thread doit
se terminer lorsque la voiture arrive au bout de la route. Pour cela vous aurez
besoin de prendre en compte la valeur de retour de road_stepCar dont vous
trouverez la description dans road.h.
3. Tester la fin d’un thread
Vous passerez à un nouveau fichier intitulé onTheRoad2.c pour cette
étape, après avoir poussé votre onTheRoad.c courant.
On aimerait que le programme sorte lorsqu’il n’y a plus de voiture sur la route.
Faites en sorte que la boucle principale teste si le thread qui fait avancer
votre voiture a terminé, en plus du test sur la touche esc. Pour cela, vous
aurez besoin de la fonction pthread_tryjoin_np.
Notez qu’un thread se termine lorsque la fonction qu’il exécute se termine.
4. Multiplication des voitures
Vous passerez à un nouveau fichier intitulé onTheRoad3.c pour cette
étape, après avoir poussé votre onTheRoad2.c courant.
Le but ici est de multiplier les voitures sur la route. Pour cela, vous allez créer une fonction qui ajoute un certain nombre de voitures, tout au long de l’exécution.
Cette fonction create_cars devra, en boucle, créer des threads en charge de
gérer chacun une voiture.
Le thread principal doit, en parallèle, mettre à jour l’affichage, il faudra
donc que la fonction create_cars soit, elle aussi, exécutée dans un thread à
part.
Notez que si vous lancez deux voitures trop proches l’une de l’autre, leur affichage sera superposé et une "collision" sera détectée et affichée en rouge.
Pour cette question, toutes les voitures peuvent avancer dans le même sens (même
valeur de "road_id" passée à road_addCar).
5. Questions "maîtrise"
Dans un nouveau fichier, onTheRoad3.c, vous traiterez les
points suivants:
-
Pour obtenir des résultats visuellement intéressants, faites varier l’intervalle de lancement des voitures de manière aléatoire ainsi que le sens de circulation à l’aide de la fonction
rand. -
Offrez à l’utilisateur la possibilité de créer une voiture lorsqu’il appuie sur "V"
-
et de faire une pause lorsqu’il appuie sur la "P".
Vous aurez besoin des fonctions:
ainsi que de la liste des codes de touche
Le #include qui va bien :
#include <allegro5/allegro.h>
Ce qui n’est pas poussé sur votre dépôt GitLab n’est pas corrigé.