IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Semaphores, partage d'une allée entre plusieurs véhicules


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Semaphores, partage d'une allée entre plusieurs véhicules
    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 !

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    un exemple de code de Semaphore Java pour te guider :
    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
     
    import static java.util.concurrent.TimeUnit.* ;
     
    public abstract class ServiceRestreint {// goulot d’étranglement
              protected Semaphore controleurEntrées;
              long attenteAdmissible ;
             °°°
     
        public ServiceRestreint(int maxU, long maxAttente,°°°) {
            controleurEntrées = new Semaphore(maxU, true) ;
            attenteAdmissible = maxAttente ;
           °°°
        }
     
        public void doIt() throws Exception {
            if(! controleurEntrées.tryAcquire( attenteAdmissible, SECONDS)) {
                throw new ExceptionAttente(°°°) ;
            }
            try {service() ;}
            finally { controleurEntrées.release();}
        }
     
        protected abstract void service() throws Exception ;
    }
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  3. #3
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Salut,

    On pourrait imaginer 2 classes DirectionAscendante et DirectionDescendente qui possedent chacun une liste de voitures en attente (protegée par semaphore). Quand une voiture veut monter, elle s'enregistre sur DirectionAscendante puis essaye de prendre le semaphore de Alley qu'elle ne relachera que quand la liste est vide.
    Pareil pour DirectionDescendente.

    a+

Discussions similaires

  1. partage d'une variable entre plusieurs threads
    Par baedal dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 27/02/2008, 21h33
  2. partager une struct entre plusieurs fils
    Par romainromain dans le forum Réseau
    Réponses: 8
    Dernier message: 22/11/2006, 21h22
  3. Réponses: 12
    Dernier message: 14/08/2006, 13h55
  4. Réponses: 5
    Dernier message: 25/04/2006, 15h13
  5. Partager une version entre plusieurs DLL
    Par barthelv dans le forum MFC
    Réponses: 4
    Dernier message: 22/11/2005, 11h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo