[t]40ex
UniversitéPierre & Marie Curie
U.F.R d'infomatique
[t]45ex
Maîtrise -- 2000-01
Programmation Objet et Distribution
Tavaux dirigés n° 5
Dans cette feuille, nos emploierons le terme << processus >> pour
désigner un << processus léger >>
Exercice I Fonctions de base sur les threads.
Question (I.1) Écrire une fonction ft1
de type unit -> unit
qui
affiche son numéro de processus, attend 1.5 secondes puis affiche un
message de fin d'exécution.
Écrire une expression qui crée un processus exécutant
ft1
et en attend la fin.
Question (I.2) Écrire une fonction ft2
de type int ref -> unit
qui incrémente son argument (disons n
), affiche son numéro
de processus et la valeur de n
et suspend son activitépendant une seconde au maximum, et ce, tant que la valeur de n
est inférieure à5. En fin de boucle, ft2
affiche un
message de sortie.
Question (I.3) Écrire une fonction ft3
qui crée deux processus
t1
et t2
exécutant chacun ft2
avec un argument
différent (disons n1
et n2
). Ceci fait, la fonction
ft3
affiche un message indiquant que t1
et t2
on
étélancés, puis elle boucle tant que les valeurs de n1
et n2
n'ont pas atteint 5.
Question (I.4) Modifiez ft2
de façon àce qu'elle boucle
infiniment (on appellera cette nouvelle fonction ft2bis
).
Question (I.5) Modifiez ft3
de façon àce qu'aprés avoir lancédeux processus qui exécutent ft2bis
, elle s'arrête dès
qu'un compteur a atteint 5, termine immédiatement l'exécution des
processus et affiche le numéro du processus ayant atteint 5.
Exercice II Exclusion mutuelle, attente sur condition.
Question (II.1) Modifiez ft2
en protégeant n
par un verrou. La
fonction devra prendre ce verrou en argument (on appellera
ft2ter
cette fonction).
Question (II.2) Modifez ft3
de façon àce qu'elle lance deux
processus qui exécutent ft2ter
et partagent la même
variable àincrémenter. Modifiez sa boucle d'attente : on a un
seul compteur et sa consultation être protégée par le
verrou. Comment sortir de la boucle ? Affichez la valeur du compteur
en fin de compte. Peut-on déterminer qui est vainqueur ?
Question (II.3) Rajoutez àft2ter
l'émission d'un signal indiquant aux
processus en attente sur le verrou qu'elle passe la main. La variable
de condition sera un argument de la fonction (que l'on appellera
ft2quart
).
Question (II.4) Modifiez la boucle de ft3
en utilisant l'attente du
signal émis par ft2quart
.
Exercice III Lecteur-écrivain.
Question (III.1) Écrire une fonction ecr
de type
float array -> Mutex.t -> Condition.t -> unit
,
qui écrit 2i dans chaque case i du tableau. L'écriture de
chacune des cases est soumise àl'obtention d'un verrou. La fonction
ecr
émet un signal et suspend son exécution aprés un
nombre aléatoire d'écritures.
Question (III.2) Écrire une fonction lec
de type
float ref -> float array -> Mutex.t -> Condition.t -> unit
qui calcule la somme des éléments du tableau de la façon
suivante : àla réception du signal, la fonction accumule toutes
les données non nulles du tableau puis se rendort jusqu'au prochain
signal.
Question (III.3) Exécutez.
Exercice IV Files d'attente (on utilisera les fonctions du module Queue).
Question (IV.1) Écrire une fonction creer_clients
qui prend en
arguments une file d'attente, un verrou et une variable de
condition. Elle boucle un nombre bornéde fois sur la séquence :
créer un nouveau numéro de client, le mettre en file d'attente,
émettre un signal, se reposer. La file d'attente est protégée
par un verrou.
Question (IV.2) Écrire une fonction guichet
qui boucle infiniment sur
la séquence : attendre qu'un client soit en attente, dès que c'est
le cas, prendre le client, attendre un certain temps. L'attente de la
file non vide utilise le signal émit par la fonction
creer_clients
. La file est protégée par le même verrou que
dans creer_clients
.
Question (IV.3) Écrire le programme principal qui crée trois processus
<< guichet >>, un processus de création de clients et attend la fin
de ce dernier. Lorsque le processus de création de clients est
terminé, il faut mettre fin àtous les processus << guichet >>.
This document was translated from LATEX by HEVEA.