Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2997 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Partager une route entre plusieurs voitures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Partager une route entre plusieurs voitures

n°2034520
Benbanana
Posté le 07-11-2010 à 18:20:36  profilanswer
 

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 !

mood
Publicité
Posté le 07-11-2010 à 18:20:36  profilanswer
 

n°2035421
joyeuxacie​r
Posté le 11-11-2010 à 13:40:33  profilanswer
 

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.
n°2035436
breizhbugs
Posté le 11-11-2010 à 15:44:41  profilanswer
 

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...

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Partager une route entre plusieurs voitures

 

Sujets relatifs
Integration de de un et plusieurs XML dans page htmlVBA Excel CheckBox
Partager une base Php entre 2 appliFonction récursive: combinaisons possibles entre plusieurs tableaux
pb de requete sur plusieurs tablesUn serveur Oracle ou plusieurs ?
Améliorer une macro: copier des valeurs sr plusieurs fl en ordre crois[Résolu] MsSql 2005 : comment vider des log de plusieurs Go?
Maximum entre plusieurs colonnesPlusieurs count dans une requete sql
Plus de sujets relatifs à : Partager une route entre plusieurs voitures


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR