项目作者: Drainman

项目描述 :
Arthur King ... in C.
高级语言: C
项目地址: git://github.com/Drainman/ArthurKing.git
创建时间: 2018-06-01T07:18:41Z
项目社区:https://github.com/Drainman/ArthurKing

开源协议:

下载


Arthur King Simulation (A C project)

Develop by Hagbuck & Drainman

Contexte

Dans un royaume fort fort lointain…

Le Roi Arthur, nouveau roi jeune et intrépide, est à la recherche d’aventure et en quête du Saint Graal.
Accompagné de ces loyaux chevaliers de la table ronde, aucune épreuve ne saurait l’arrêter.
Ces vaillants paladins de la justice divine sont chargés d’assurer la paix dans le royaume. Pour y
parvenir, ces derniers partent vaillamment accomplir les quêtes de la couronne. Affrontant de
terrifiants dragons, de maléfiques créatures sorties d’outre-tombe, leur absence peut s’avérer longue
pour notre jeune roi.

Pendant que ces braves soldats légendaires sont absents, notre roi doit s’occuper de ces tâches
royales. La principale besogne d’Arthur est de s’occuper du jugement de ces subalternes. En effet tous
les paysans du royaume viennent chaque jour afin de rencontrer notre bon roi. Bien que généreux et
bienveillant, Arthur ne reçoit que 3 requêtes à la fois. Il serait dommage de bâcler cette mission
essentielle pour la stabilité du royaume.

« Messire ! Messire ! Vos valeureux guerriers sont tous revenue de leurs aventures ! Il est l’heure ! »
s’écrit Merlin. Au retour des 11 chevaliers, le Roi Arthur ne peut s’empêcher d’enfourner son épée et
son armure, et partir à la recherche du Ô saint Graal. Notre roi appelle Merlin, et convoque ces 11
chevaliers de la table ronde. « Au diable ces pauvres gueux, ils attendront notre retour ! » s’écrie le roi
Arthur avant de partir fièrement, la tête haute vers sa destinée …

Sommaire

Utilisation

Lancement du programme

  • OS Support : Linux
  • Entrez “make” dans le répertoire du projet.
  • Lancez “./arthurKing”

Modifier le paramètrage

Editez “arthurKing.h” :

  • Définir le nombre de paysans : #define NB_PAYSANS [VOTRE NOMBRE]
  • Définir le timer max des chevaliers (retour de quête) : #define MAX_TIMER_KNIGHTS [VALEUR TIMER]
  • Définir le timer max des paysans : #define MAX_TIMER_FARMER [VALEUR TIMER]

Algorithme

PTHREADS

  • [1] - Roi - king()
  • [11] - Chevaliers - chevalier()
  • [NB_PAYSANS] - Paysans - paysans()

Acteurs

Le Roi

Boucle de manière infini. A chaque itération :

  • Regarde si les chevaliers sont tous disponibles.
  • Si oui => Leur ordonne de partir en quête avec lui et appelle Merlin.
  • Sinon => Si 3 paysans attendent de se faire juger, les juge.

Les Chevaliers

Boucle de manière infini. A chaque itération :

  • Part en quête pendant un timer de durée alétoire
  • A la fin prévient le Roi de sa disponibilité.
  • Attend que ce dernier et tous les autres soient disponibles avant de partir à la recherche Graal avec tout le monde.
  • Repart en quête.

Les Paysans

Une seul itération :

  • Fait sa vie jusqu’à avoir une requête à faire au Roi (timer de durée aléatoire).
  • Se rend à la cours.
  • Tente de rentrer dans le palais.
  • Attends que 3 autres paysans soient présents ainsi que la présence du Roi.
  • Se fait juger.

Semaphores

semChevaliersDispo

  • Description : Indique le nombre de chevaliers disponibles pour partir à la recherche du Graal.
  • Place : 11
  • Consomateur : Les Chevaliers.
  • Lecteur : Le Roi.

semPaysansEnJugement

  • Description : Indique le nombre de paysans prêts à être jugé.
  • Place : 3
  • Consomateur : Les Paysans.
  • Lecteur : Le Roi.

semJugement

  • Description : Sert au jugement des paysans. Le Roi prend la ressource au début du programme. Lorsque trois paysans attendent de se faire juger et que le Roi n’est pas à la recherche du Graal, il libère la ressource qui est alors consommé à tour de rôle par les paysans. Puis le Roi reprend la ressource pour empêcher que d’autres paysans ne se fassent juger tant qu’ils ne sont pas trois.
  • Place : 1
  • Consomateur : Le Roi et les Paysans.

Thread

Le Roi

  1. void king(void * ptr)
  2. {
  3. printf("[KING] - Welcome in my Kingdom. \n");
  4. //Prend la ressource d'accès à la salle de jugement (1 place)
  5. sem_wait(&semJugement);
  6. while(1)
  7. {
  8. //Prend du repos
  9. sleep(2);
  10. //Regarde la disponibilité des chevaliers
  11. int placeChevalier;
  12. sem_getvalue(&semChevaliersDispo,&placeChevalier);
  13. printf("[INFO/KING] - WAITING KNIGHTS -> %d \n",placeChevalier);
  14. //Tout les chevaliers sont disponibles
  15. if(placeChevalier <= 0)
  16. {
  17. //Défini un timer commun pour lui et le chevalier (= temps de recherche du Graal)
  18. timerGraal = rand() % 25 ;
  19. //Ordonne au chevalier de partir
  20. tag = 'G';
  21. //Invoque Merlin
  22. invoqueMerlin();
  23. //Retour au royaume
  24. printf("[KING] - I'm back to my kingdom !\n");
  25. //Ne donne plus d'ordre
  26. tag = ' ';
  27. }
  28. //Chevaliers indisponibles
  29. else
  30. {
  31. //Récupère le nombre de paysans en attente d'etre juge
  32. int placePaysans;
  33. sem_getvalue(&semPaysansEnJugement,&placePaysans);
  34. printf("[WARNING] - PLACE SEM FARMERS -> %d \n",placePaysans);
  35. //Si 3 paysans attendent
  36. if(placePaysans <= 0 ){jugement();}
  37. }
  38. //Reboucle
  39. }
  40. //Fin Thread King
  41. pthread_exit(0);
  42. }

Les Chevaliers

  1. void chevalier(void *ptr)
  2. {
  3. while(1)
  4. {
  5. //TIMER
  6. sleep( rand() % MAX_TIMER_KNIGHTS);
  7. //EVENT
  8. rendreCompte(ptr);
  9. //WAIT FOR KING
  10. while(tag != 'G'){}
  11. //Cherche le Graal
  12. chercherGraal(ptr);
  13. //Libère le sémaphore --> Se rend indisponible et repart en quete
  14. sem_post(&semChevaliersDispo);
  15. printf("[CHEVALIER %d] - Come back for my quest.\n",x);
  16. //while --> Reparte en quete
  17. }
  18. //Fin Thread King
  19. pthread_exit(0);
  20. }

Les Paysans

  1. void paysans(void *ptr)
  2. {
  3. //N'a pas de reqete à faire au roi avant la fin du timer
  4. sleep( rand() % MAX_TIMER_FARMER) + 1;
  5. printf("[PAYSANS %d] - Se rend à la cours.\n",x );
  6. //Demande à voir le roi -> Attends de pouvoir rentrer dans le palais
  7. sem_wait(&semPaysansEnJugement);
  8. //Est dans le palais et attends dans la salle d'attente
  9. printf("[PAYSANS %d] - Attends dans la salle.\n",x );
  10. //Attend que le roi l'accueil et le juge
  11. sem_wait(&semJugement);
  12. printf("[PAYSANS %d] - Jugé.\n",x);
  13. sem_post(&semJugement);
  14. //Laisse la place à un autre paysan
  15. pthread_exit(0);
  16. }

Fonctions par acteurs

jugement() (Le Roi)

  1. void jugement()
  2. {
  3. printf("[KING] - AND THIS IS MY JUGEMENT !!!\n");
  4. //Libère la semaphore de un pour indiquer aux paysans qu'ils sont jugés.
  5. sem_post(&semJugement);
  6. usleep(200);
  7. sem_wait(&semJugement);
  8. //On libère les trois paysans aprés le jugement
  9. for(int i=0;i<3;i++){sem_post(&semPaysansEnJugement);}
  10. }

invoqueMerlin() (Le Roi)

  1. void invoqueMerlin()
  2. {
  3. //Appelle Merlin
  4. printf("[MERLIN] - Merlin ! I need some help !\n");
  5. //Attends la fin du timer partagé avec les chevalier
  6. sleep( timerGraal);
  7. }

chercherGraal() (Les Chevaliers)

  1. void chercherGraal(void * ptr)
  2. {
  3. //Préviens de son départ en quete
  4. printf("[CHEVALIER %d] - ALRIGHT LET'S GO TO FIND THIS BOOK !\n",x);
  5. //Timer de quete commun avec le Roi
  6. sleep( timerGraal);
  7. }

rendreComptee() (Chevaliers)

  1. void rendreCompte(void *ptr)
  2. {
  3. //Se rend disponible pour le roi --> Consomme le sémaphore
  4. sem_wait(&semChevaliersDispo);
  5. printf("[CHEVALIER %d] - My king I've complete my quest.\n",x );
  6. }