Bonjour,

Je suis en train d'apprendre à bien utiliser les event en Ocaml. Pour cela, j'ai trouvé un exercice dans un ancien partiel de première année de master à faire http://www-apr.lip6.fr/~chaillou/Pub...2r-12-2003.pdf.

N'ayant par contre pas trouvé de choses extraordinaires sur Event, je vais juste expliquer ce que j'aurais fait (ou hésiter à faire) en espérant que vous puissiez me guider ;-)

Déjà sur les Event en eux-mêmes. On peut ouvrir des channels de communication, communiquer de façon synchronisée ou non dessus. Ensuite, on peut associer à un event une fonction grâce à la fonction wrap. Si dans notre programme, on doit gérer plusieurs évènements différents sur des channels différents (pas forcément ?), on peut utiliser la fonction choose qui prend une liste des différents events et renvoit l'évènement correspondant. J'ai trouvé un bout de code qui compose wrap, choose mais là encore ce n'est pas très clair dans ma tête...

Sur l'exercice en lui-même, il y a plusieurs choses qui me paraissent étranges... Au début, l'énoncé nous propose deux variables globales, le channel celle là je comprends et un tableau de channel (je comprends déjà moins bien mais admettons).

Sachant qu'un seul avion ne pourra être présent sur chaque couche et sur la piste, j'utiliserais des mutex pour les représenter. Lorsqu'un pilote contacte le contrôleur sur cuc, je créerais un thread représentant le contrôleur en lui passant en paramètre un channel privé et je renverrai ce channel privé sur cuc. À partir de là, le pilote et le contrôleur alterne entre Event.sync (Event.reveive ...) et Event.sync (Event.send ...). À chaque fois c'est le thread du contrôleur qui s'occupe de verrouiller le mutex ainsi le pilote n'a aucune vérification à faire.

Ce qui donnerai un code ressemblant à ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
(* airport simulation *)
 
let cuc = Event.new_channel ()
 
let layers = Array.make 5 (Mutex.create ())
let runway = Mutex.create ()
 
let airport_thread channel =
  for i = 5 downto 0 do
    Mutex.lock layers.(i);
    if i <> 5 then
      Mutex.unlock couches.(i + 1);
    Event.sync (Event.send channel ("couche" ^ (string_of_int i)));
    Event.sync (Event.receive channel);
    Event.sync (Event.receive channel);
  done;
  Mutex.lock runway;
  Mutex.unlock layers.(0);
  Event.sync (Event.send channel "atterrissage");
  Event.sync (Event.receive channel);
  Event.sync (Event.receive channel);
  Mutex.unlock runway;
  Thread.exit ()
 
let pilote channel =
  Event.sync (Event.send channel "Need channel");
  let y = Event.sync (Event.receive (channel)) in
  for i = 0 to 5 do
    Event.sync (Event.receive y);
    Event.sync (Event.send "recu");
    Thread.delay 0.5;
  done
(* etc *)
 
let main () =
  while true do
    Event.sync (Event.receive cuc);
    let channel = new_channel () in
    Thread.create airport channel;
  done
Le code n'est pas complet, mais c'est pour l'idée. Mais ça ne me semble pas très correct... Parce que là j'ajoute des threads alors que dans l'énoncé ce n'est pas très clair. J'hésite avec une seule fonction controler qui réalise un choose sur l'ensemble des channels privés avec un wrap associé ou autre.

Bref je suis un petit peu perdu...

Si vous pouviez m'aiguiller, ce serait sympa ;-)

--
sperca