Partager une route entre plusieurs voitures

Partager une route entre plusieurs voitures - Java - Programmation

Marsh Posté le 07-11-2010 à 18:20:36    

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 :
  1. class Alley
  2. {
  3. static Integer up;
  4. static Integer down;
  5. static Semaphore sem;
  6. public Alley()
  7. {
  8.         if(sem == null) {
  9.          sem = new Semaphore(1);
  10.      }
  11.         up = 0;
  12.         down = 0;
  13. }
  14.    public void enter(int no) throws InterruptedException
  15.    {
  16.  if(no > 4) {
  17.          if(down == 0) {
  18.     sem.P();
  19.       }
  20.    down++;
  21.  } else {
  22.   if(up == 0) {
  23.    sem.P();
  24.   }
  25.   up++;
  26.  }
  27.    }
  28.    public void leave(int no)
  29.    {
  30.  if(no>4) {
  31.   down--;
  32.   if(down == 0) {
  33.       sem.V();           
  34.   }
  35.  } else {
  36.   up--;
  37.         if(up == 0) {
  38.          sem.V();                   
  39.         }
  40.  }
  41.    }
  42. }


 
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 :
 
 
http://www.casimages.com/img.php?i=101107051348775900.png
 
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 !

Reply

Marsh Posté le 07-11-2010 à 18:20:36   

Reply

Marsh Posté le 11-11-2010 à 13:40:33    

Pourquoi ne pas copier le monde réel et avoir une classe "feu de signalisation" qui reçoit le message émis quand les voitures ont fini de passer. Et tu mets un petit peu de pooling dans ta classe "voiture" pour qu'elle regarde fréquemment si:
- le feu est passé au vert;
- il n'y a pas de voitures arrêtées devant elle.


---------------
Mais toi aussi - La misère du monde, c'est aussi de ta faute.
Reply

Marsh Posté le 11-11-2010 à 15:44:41    

Alors,
Sans avoir lu ton code, je dirait qu'il faut deux sémaphores(1 dans chaque sens)
Ensuite  
pour une voiture descendant:
si le semaphore 'montant' = 0 alors on passe et on incrémente le semaphore descendant de 1
quand une voiture sort de la zone, décrémenter descendant de 1;
vice versa dans l'autre sens
edit: après survol : surtout qu'avec ton code tu ne protèges pas up et down d'une lecture écriture simultanée!


Message édité par breizhbugs le 11-11-2010 à 15:49:17

---------------
Seul Google le sait...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed