Bonjour,
J'ai un exercice à faire concernant le Java mais surtout le partage d'une ressource entre plusieurs processus.
En voici l'énoncé :
L'objectif est de gérer un circuit pour voitures.
Dans ce circuit se trouve une voie où deux voitures ne peuvent pas se croiser.
4 voitures montent par cette voie, 4 voitures descendent par cette voie.
Il faut éviter les collisions entre ces voitures. Donc il faut que si une voiture monte par la voie, les autres voitures puissent la suivre.
Et si une voiture descend par cette voie, les autres voitures puissent la suivre.
Si la voie se libère, les voitures en attente en haut de la voie ou en bas peuvent s'engager (mais pas les deux en même temps).
Pour résoudre ce problème, je dois créer une classer Alley qui fait patienter les voitures à l'entrer de la voie si celle-ci est indisponible et les laisse entrer quand la voie se libère.
J'ai uniquement le droit d'utiliser, comme mécanisme de partage de ressource, des sémaphores.
Voilà ce que je pensais faire :
La méthode enter est appelée avant de déplacer la voiture dans l'allée, la méthode leave au moment où la voiture quitte l'allée. Une autre (qui fonctionne) évite que les voitures entrent en collision.
Code :
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
41
42
43
44
45
46
47
48
49 class Alley { static Integer up; static Integer down; static Semaphore sem; public Alley() { if(sem == null) { sem = new Semaphore(1); } up = 0; down = 0; } public void enter(int no) throws InterruptedException { if(no > 4) { if(down == 0) { sem.P(); } down++; } else { if(up == 0) { sem.P(); } up++; } } public void leave(int no) { if(no>4) { down--; if(down == 0) { sem.V(); } } else { up--; if(up == 0) { sem.V(); } } } }
Le problème est que si deux voitures attendent en bas de l'allée en même temps, elle vont toutes les deux se retrouver en attente d'un signal émanant de sem.
Et quand l'allée se libérera, seulement un signal est envoyé, donc une seule des deux voitures sera débloquée.
Les voitures qui arriveront ensuite par en bas pourront la suivre, mais celle qui attendait déjà sera bloquée jusqu'à obtention du prochain signal.
Une image pour illustrer le problème :
Les voitures 2 et 3 sont toutes les deux en attente du signal
Ce signal sera envoyé quand l'allée sera libérée.
Seule une des deux voitures pourra entrer dans l'allée, ainsi que celle qui la suit.
Je ne vois pas vraiment comment résoudre "simplement" ce problème.
Merci de votre aide, si vous voulez plus d'informations n'hésitez pas !
Partager