1 / 21

Threads et Synchronisation

Threads et Synchronisation. Application train Présentation. Objectif du chapitre. Application des chapitres threads et synchronisation à un exemple concret. TRAINS (1). On suppose une voie ferrée unique Des trains doivent passer dans les 2 sens de A vers B et de B vers A

ron
Download Presentation

Threads et Synchronisation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Threads et Synchronisation Application train Présentation Trains_presentation

  2. Objectif du chapitre • Application des chapitres threads et synchronisation à un exemple concret Trains_presentation

  3. TRAINS (1) • On suppose une voie ferrée unique • Des trains doivent passer dans les 2 sens de A vers B et de B versA • On suppose 5 trains en attente de chaque cote • 3 trains peuvent se suivre pour emprunter cette voie unique • Ecrire le programme qui va gérer le passage de ces 10 trains en toute sécurité Trains_presentation

  4. TRAINS (2) • Comme plusieurs trains peuvent se suivre dans le même sens, il n’y a pas exclusion mutuelle entre tous les trains • Dans ce cas on utilise la technique des Sémaphores • On va créer un sémaphore à 3 jetons • De plus pour la sécurité du sens on va créer un événement SENS_AB, et un événement SENS_BA Trains_presentation

  5. TRAIN (3) • Pour qu’un train puisse entrer sur la voie il lui faudra obtenir l’événement de sens et de plus un des jetons du sémaphore • Chaque train sera un thread • Il y aura 5 Threads AB_MAIN ( A vers B) • Il y aura 5 Threads BA_MAIN ( B vers A) • Lors des CreateThread on passera un numéro (1 à 5) pour différencier les 5 Threads de chaque sens, ce qui permet de ne pas écrire le code de 10 threads, mais seulement de 2 Trains_presentation

  6. TRAIN (4) • Programme principal • Créer les 10 trains (Threads) • Créer les Event de sens • Créer le sémaphore à 3 jetons possibles • Gérer le passage des trains (2 passages dans chaque sens, ou boucle tant que le dernier train n’est pas arrivé: dernier thread non actif) • Fermer tout ce qui a été ouvert (Handle) Trains_presentation

  7. TRAIN (5) • Boucle de gestion des trains • Libérer les jetons • Positionner A vers B pendant 500 ms • Attendre l’arrivée des trains en récupérant les jetons • Faire la même chose pour l’autre sens • S’arrêter quand tous les trains sont passés Trains_presentation

  8. TRAIN (6) • Thread train • Récupérer le numéro du train • Attendre le sémaphore et l’événement de sens • Envoyer message « train numéro x parti » • Attendre 1 seconde (durée du trajet) • Envoyer message « train numéro x arrivé » • Rendre le jeton Trains_presentation

  9. TRAIN main(1) #include "stdafx.h" #include "Winbase.h" DWORD WINAPI AB_MAIN (LPVOID p); DWORD WINAPI BA_MAIN (LPVOID p); HANDLE SEM; HANDLE SENS_AB,SENS_BA; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { Trains_presentation

  10. TRAIN main(2) // Définitions et réservations // Paramètres passés aux threads valeurs de 1 à 5 // TODO // HANDLE utilisés // TODO printf("début du main\n\r\n"); // Création d'un sémaphore à 3 jetons possibles // vide au départ // TODO Trains_presentation

  11. TRAIN main(3) // Création des événements de sens // TODO // Création des 10 Threads // TODO Trains_presentation

  12. TRAIN main(4) // Boucle principale do { // Attente avant départ de A vers B (1 seconde) // TODO // Libération des 3 jetons // TODO // Set de l'Event de sens de A vers B // TODO // Attente de 500 tics ( demi seconde) // TODO // Reset de l'Event de sens de A vers B // TODO Trains_presentation

  13. TRAIN main(4) // Attente de l'arrivée des trains // Récupération des 3 jetons // TODO // Attente avant départ de B vers A (1 seconde) // TODO // Libération des 3 jetons // TODO // Set de l'Event de sens de B vers A // TODO // Attente de 500 tics // TODO // Reset de l'Event de sens de B vers A // TODO Trains_presentation

  14. TRAIN main(5) // Attente de l'arrivée des trains // Récupération des 3 jetons // TODO // Vérification de l'arrivée du dernier train // TODO } while // Fin de boucle // TODO Trains_presentation

  15. TRAIN main(6) printf ("fin du main"); getchar(); // Close des Handle // TODO return 0; } Trains_presentation

  16. TRAIN ThreadA_B (1) DWORD WINAPI AB_MAIN (LPVOID p) { // Initialisation des variables de retour // de la fonction WaitForSingleObject DWORD SENS=1,SEMA=1; // Récupération du numéro du thread (DWORD pp) // p est un pointeur de void // il pointe sur le paramètre passé au thread // TODO Trains_presentation

  17. TRAIN ThreadA_B (2) // Attente de l'obtention du sens et du sémaphore // les 2 valeurs doivent être égales a zéro // TODO // Traitement printf ("départ du train AB %d \n\r",pp); Sleep (1000); printf ("arrivée du train AB %d \n\r",pp); // Libération du sémaphore // TODO return 0; } Trains_presentation

  18. TRAIN ThreadB_A (1) DWORD WINAPI BA_MAIN (LPVOID p) { // Initialisation des variables de retour // de la fonction WaitForSingleObject DWORD SENS=1,SEMA=1; // Récupération du numéro du thread (DWORD pp) // p est un pointeur de void // il pointe sur le paramètre passé au thread // TODO Trains_presentation

  19. TRAIN ThreadB_A (2) // Attente de l'obtention du sens et du sémaphore // les 2 valeurs doivent être égales a zéro // TODO // Traitement printf ("départ du train BA %d \n\r",pp); Sleep (1000); printf ("arrivée du train BA %d \n\r",pp); // Libération du sémaphore // TODO return 0; } Trains_presentation

  20. Résultat Trains_presentation

  21. Conclusion • Une bonne utilisation des sémaphores et des événements permet d’obtenir l’enchaînement désiré Trains_presentation

More Related