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

Java Discussion :

Semaphore ! ne s'arrete jamais


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut Semaphore ! ne s'arrete jamais
    salut les amis
    j'ai un soucis au niveau de mon code et je ne comprend pas d'ou peut provenir mon erreur
    en fait j'ai créé 3 thread qui sont censé jongler avec le systeme de gestion de la concurrence mais le probleme c'est qu'ils se bloquent jamais
    par exemple si j'ai une ressource a=1 et que le thread l'utilises , les autres sont censé attendre que le thread 1 finisse pour a leur tour utiliser la ressource mais ils ne se bloquent pas

    voici le 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
    50
    51
    52
    53
    54
     
    import java.util.concurrent.Semaphore;
     
     
    public class MyThread extends Thread{	
     
    	//public static int ProcId = 0;
    	Semaphore Sem_Place;
    	Semaphore Sem_Rampe;
    	private static int place_nbr = 1;
    	private static int rampe = 1;
     
    	MyThread(){
     
    		Sem_Place = new Semaphore(this.place_nbr,true);
    		Sem_Rampe = new Semaphore(this.rampe,true);
     
    	}
     
    	public void run(){
     
    		try {
    			System.out.println("(Proc : "+this.getId()+") Veut rentrer dans le parking !");
    			this.entrer_parking();
    			System.out.println("(Proc : "+this.getId()+") Veut sortir du parking !");
    			this.sortir_parking();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
     
    	public void entrer_parking() throws InterruptedException{
     
    		Sem_Place.acquire();
    		System.out.println("(Proc : "+this.getId()+") a donné sa carte");
    		Sem_Rampe.acquire();
    		System.out.println("(Proc : "+this.getId()+") passe sur la rampe");
    		Sem_Rampe.release();
    		System.out.println("(Proc : "+this.getId()+") est descendu de la rampe et est garé a sa place !");
    	}
     
    	public void sortir_parking() throws InterruptedException{
    		Sem_Rampe.acquire();
    		System.out.println("(Proc : "+this.getId()+") passe sur la rampe");
    		Sem_Rampe.release();
    		System.out.println("(Proc : "+this.getId()+") est descendu de la rampe");
    		Sem_Place.release();
    		System.out.println("(Proc : "+this.getId()+") est sortie du parking...Place liberée !");
    	}
     
     
    }
    et mon main

    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
     
     
    public class main {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
     
     
    		MyThread P1 = new MyThread();
    		MyThread P2 = new MyThread();
    		MyThread P3 = new MyThread();
     
    		P1.start();
    		P2.start();
    		P3.start();
     
    	}
     
    }

  2. #2
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Ques-ce qui te fait dire qu'aucun thread n'a "attendu" lors d'un acquire ?

    Tu peu essayer de remplacer tes "acquire" par des "tryAcquire" et voir si un thread retourne false.

    Sinon, si ta plateforme est mono-core, il se peut également que tes threads s'execute finalement séquentiellement dans ton cas (car ils ont un code trés minimaliste) et tout dépends du scheduler.

  3. #3
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    Ques-ce qui te fait dire qu'aucun thread n'a "attendu" lors d'un acquire ?
    j'ai fait un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(this.getId() == 8) 
         MyThread.sleep(10);
    8 etant un numero de processus retourné
    et aucun blocage constaté

    sinon jsuis en dual core...

  4. #4
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    je ne comprends pas en quoi ce "sleep" t'indique que les méthodes acquire n'ont pas provoquées d'attentes ?

  5. #5
    Membre éclairé Avatar de snipes
    Inscrit en
    Septembre 2004
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 547
    Par défaut
    comme je le fais apres acquire normalement la ressource est censé etre prise ?
    donc ceux qui viennent apres ne attendent ?
    dis moi si je me trompe

  6. #6
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Chacun de tes threads possédent leurs propres sémaphores alors que ces derniers doivent être partagés entre les differents threads afin de servire de mécanismes de synchronisations.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48
  2. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36
  3. [UDP][Socket] perte de paquets et arret d'ecoute sur port
    Par Guismo1979 dans le forum Développement
    Réponses: 6
    Dernier message: 02/01/2003, 12h13
  4. probleme a l'arret de threads
    Par Sei dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/12/2002, 12h15
  5. Detection arret de windows
    Par philippe30 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/09/2002, 18h41

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