carsOnTheRoad

Le répertoire de ce TP dans votre dépôt s’appellera "TPThreadRoad".

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.

Fichiers attendus:
  • OS_NomA_NomB

    • TPThreadRoad

      • .gitignore (avec tout ce qui n’est pas attendu)

      • Makefile

      • onTheRoad.c

      • onTheRoad2.c

      • onTheRoad3.c

Rappel

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

Il est judicieux à ce stade de prendre connaissance du support de cours sur les threads.

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>
Rerappel

Ce qui n’est pas poussé sur votre dépôt GitLab n’est pas corrigé.