+ All Categories
Home > Documents > Threads et Synchronisation

Threads et Synchronisation

Date post: 14-Jan-2016
Category:
Upload: ron
View: 29 times
Download: 2 times
Share this document with a friend
Description:
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 - PowerPoint PPT Presentation
21
jc/md/lp-01/05 Trains_presentation 1 Threads et Synchronisation Application train Présentation
Transcript
Page 1: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 1

Threads et Synchronisation

Application train

Présentation

Page 2: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 2

Objectif du chapitre

• Application des chapitres threads et synchronisation à un exemple concret

Page 3: Threads et Synchronisation

jc/md/lp-01/05 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 vers A• 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é

Page 4: Threads et Synchronisation

jc/md/lp-01/05 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

Page 5: Threads et Synchronisation

jc/md/lp-01/05 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

Page 6: Threads et Synchronisation

jc/md/lp-01/05 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)

Page 7: Threads et Synchronisation

jc/md/lp-01/05 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

Page 8: Threads et Synchronisation

jc/md/lp-01/05 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

Page 9: Threads et Synchronisation

jc/md/lp-01/05 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){

Page 10: Threads et Synchronisation

jc/md/lp-01/05 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

Page 11: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 11

TRAIN main(3)

// Création des événements de sens

// TODO

// Création des 10 Threads

// TODO

Page 12: Threads et Synchronisation

jc/md/lp-01/05 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

Page 13: Threads et Synchronisation

jc/md/lp-01/05 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

Page 14: Threads et Synchronisation

jc/md/lp-01/05 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

Page 15: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 15

TRAIN main(6)

printf ("fin du main");

getchar();

// Close des Handle

// TODO

return 0;

}

Page 16: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 16

TRAIN ThreadA_B (1)

DWORD WINAPI AB_MAIN (LPVOID p){

// Initialisation des variables de retour // de la fonction WaitForSingleObjectDWORD 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

Page 17: Threads et Synchronisation

jc/md/lp-01/05 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

// Traitementprintf ("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;}

Page 18: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 18

TRAIN ThreadB_A (1)DWORD WINAPI BA_MAIN (LPVOID p){

// Initialisation des variables de retour // de la fonction WaitForSingleObjectDWORD 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

Page 19: Threads et Synchronisation

jc/md/lp-01/05 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

// Traitementprintf ("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;}

Page 20: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 20

Résultat

Page 21: Threads et Synchronisation

jc/md/lp-01/05 Trains_presentation 21

Conclusion

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


Recommended