TP Noté - LIF12 système d`exploitation

Transcription

TP Noté - LIF12 système d`exploitation
Département d’Informatique
TP Noté - LIF12 système d’exploitation
1h30 tout document autorisé
1er décembre 2015
Les programmes qui vous sont demandés doivent être écrits en C sur les machines de la salle. Vous n’êtes
pas autorisés à échanger d’information (notamment par le réseau), ni à vous connecter aux réseaux extérieurs
de la salle.
Les machines de la salle vous permettent de vous connecter localement avec le login moi et le mot de
passe moi. Vous sauvegarderez votre travail sur ce compte, et vous le déposerez à la fin sous la forme d’une
archive nom_prenom.tar.gz sur le serveur http://10.0.10.15/LIF12/. Sans cela, votre travail ne pourra
pas être considéré.
I
Daisy Town
Vous allez devoir simuler le célèbre duel de Daisy Town opposant Lucky Luke aux frères Dalton. Lucky
Luke est le plus rapide mais il se mesure à 4 personnes...
Pour cela vous allez devoir utiliser les fonctions qui ont été préparées pour vous :
— tire () est la fonction qui simule un tire via l’appel à pthread_cancel() ce qui nécessite le numéro du
thread à éliminer via le paramètre pthread_t cible. temps est le paramètre qui permet de simuler des
réflexes plus ou moins rapides, les deux autres paramètres permettent de faire des affichages.
— void luckyLuke(pthread_t daltons[4]) permet de simuler le comportement de Lucky Luke, il a besoin du
numéro de thread de chacun des 4 frères Dalton pour la fonction tire () .
— void daltons(pthread_t luke, int num) est la fonction qui simule le comportement d’un des Dalton, luke
doit être le numéro du thread « Lucky Luke » et num est le numéro du Dalton (par ordre de taille).
Ces fonction se trouvent dans le fichier duel.c sur le site http://10.0.10.15/LIF12/
II
Travail à faire
Q.II.1) - Vous devez faire un programme qui lance 5 threads (un pour chaque protagoniste).
La difficulté de cette question est que les threads doivent avoir connaissance du numéro des autres threads.
Or les premiers à être lancés le sont forcément avant que les numéros des autres soient fixés. Pour cela il y a
2 méthodes :
— faire attendre tous les threads pendant 1 seconde avant de lire une variable partagée ;
— bloquer les threads uniquement le temps nécessaire grâce à des outils de synchronisation vus en cours.
Bien sûr, la seconde méthode doit être préférée, mais il est préférable de rendre un programme qui fonctionne.
Q.II.2) - De plus, vous devez faire en sorte que le thread principal soit capable de connaître les threads survivants et affiche :
— « Luke a gagné » si Lucky Luke élimine tous les Dalton ;
— le nombre de Dalton survivants sinon.
Q.II.3) - Enfin, les Dalton tirent en même temps sur Lucky Luke ce qui va provoquer une erreur s’ils sont
plusieurs à le faire. En effet, le second essayera d’envoyer un pthread_cancel() à une tâche terminée.
Pour éviter cela, vous devez modifier la fonction tire () pour que seul le premier Dalton à parvenir au
niveau du pthread_cancel() utilise la fonction.
Université Claude Bernard Lyon I
1