Arthur King ... in C.
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 …
Editez “arthurKing.h” :
Boucle de manière infini. A chaque itération :
Boucle de manière infini. A chaque itération :
Une seul itération :
void king(void * ptr)
{
printf("[KING] - Welcome in my Kingdom. \n");
//Prend la ressource d'accès à la salle de jugement (1 place)
sem_wait(&semJugement);
while(1)
{
//Prend du repos
sleep(2);
//Regarde la disponibilité des chevaliers
int placeChevalier;
sem_getvalue(&semChevaliersDispo,&placeChevalier);
printf("[INFO/KING] - WAITING KNIGHTS -> %d \n",placeChevalier);
//Tout les chevaliers sont disponibles
if(placeChevalier <= 0)
{
//Défini un timer commun pour lui et le chevalier (= temps de recherche du Graal)
timerGraal = rand() % 25 ;
//Ordonne au chevalier de partir
tag = 'G';
//Invoque Merlin
invoqueMerlin();
//Retour au royaume
printf("[KING] - I'm back to my kingdom !\n");
//Ne donne plus d'ordre
tag = ' ';
}
//Chevaliers indisponibles
else
{
//Récupère le nombre de paysans en attente d'etre juge
int placePaysans;
sem_getvalue(&semPaysansEnJugement,&placePaysans);
printf("[WARNING] - PLACE SEM FARMERS -> %d \n",placePaysans);
//Si 3 paysans attendent
if(placePaysans <= 0 ){jugement();}
}
//Reboucle
}
//Fin Thread King
pthread_exit(0);
}
void chevalier(void *ptr)
{
while(1)
{
//TIMER
sleep( rand() % MAX_TIMER_KNIGHTS);
//EVENT
rendreCompte(ptr);
//WAIT FOR KING
while(tag != 'G'){}
//Cherche le Graal
chercherGraal(ptr);
//Libère le sémaphore --> Se rend indisponible et repart en quete
sem_post(&semChevaliersDispo);
printf("[CHEVALIER %d] - Come back for my quest.\n",x);
//while --> Reparte en quete
}
//Fin Thread King
pthread_exit(0);
}
void paysans(void *ptr)
{
//N'a pas de reqete à faire au roi avant la fin du timer
sleep( rand() % MAX_TIMER_FARMER) + 1;
printf("[PAYSANS %d] - Se rend à la cours.\n",x );
//Demande à voir le roi -> Attends de pouvoir rentrer dans le palais
sem_wait(&semPaysansEnJugement);
//Est dans le palais et attends dans la salle d'attente
printf("[PAYSANS %d] - Attends dans la salle.\n",x );
//Attend que le roi l'accueil et le juge
sem_wait(&semJugement);
printf("[PAYSANS %d] - Jugé.\n",x);
sem_post(&semJugement);
//Laisse la place à un autre paysan
pthread_exit(0);
}
void jugement()
{
printf("[KING] - AND THIS IS MY JUGEMENT !!!\n");
//Libère la semaphore de un pour indiquer aux paysans qu'ils sont jugés.
sem_post(&semJugement);
usleep(200);
sem_wait(&semJugement);
//On libère les trois paysans aprés le jugement
for(int i=0;i<3;i++){sem_post(&semPaysansEnJugement);}
}
void invoqueMerlin()
{
//Appelle Merlin
printf("[MERLIN] - Merlin ! I need some help !\n");
//Attends la fin du timer partagé avec les chevalier
sleep( timerGraal);
}
void chercherGraal(void * ptr)
{
//Préviens de son départ en quete
printf("[CHEVALIER %d] - ALRIGHT LET'S GO TO FIND THIS BOOK !\n",x);
//Timer de quete commun avec le Roi
sleep( timerGraal);
}
void rendreCompte(void *ptr)
{
//Se rend disponible pour le roi --> Consomme le sémaphore
sem_wait(&semChevaliersDispo);
printf("[CHEVALIER %d] - My king I've complete my quest.\n",x );
}