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

C++/CLI Discussion :

Probleme de gestion de semaphore


Sujet :

C++/CLI

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Par défaut Probleme de gestion de semaphore
    Bonjour,
    Je viens de manipuler une sémaphore dans mon projet.
    Mon problème c'est que la fonction WaitForSingleObject() ne prend pas d'effet même si je la configure avec le paramètre INFINITE.
    C'est à dire lorsque je fais deux appel consécutif de la fonction WaitForSingleObject() ca passe toujours.
    Voici un exemple qui illustre mon problème

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    // TestMutex.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include <stdio.h>
    #include <winsock2.h>
    #include <WinBase.h>
     
    HANDLE SemMutex;
     
    void Funct1 (void)
    {
    	int err = 0;
    	DWORD dwWaitResult;
     
    	SemMutex = CreateMutex (NULL, // default security attributes
                                FALSE, // initially not owned
                                NULL // unnamed mutex
                                );
     
        if (SemMutex == NULL)
        {
            // An error has occurred
            err = 1;
        }
     
    	dwWaitResult = WaitForSingleObject (SemMutex, // handle to mutex
                                            INFINITE // no time-out interval
    										);
     
        /*if (ReleaseMutex (SemMutex) != 0)
        {
            err = 1;
        }
     
        if (CloseHandle (SemMutex) != 0)
        {
            err = 1;
        }*/
    }
     
    void Funct2 (void)
    {
    	int err = 0;
    	DWORD dwWaitResult;
     
    	Sleep (2000);
     
    	SemMutex = CreateMutex (NULL, // default security attributes
                                FALSE, // initially not owned
                                NULL // unnamed mutex
                                );
     
        if (SemMutex == NULL)
        {
            // An error has occurred
            err = 1;
        }
     
    	dwWaitResult = WaitForSingleObject (SemMutex, // handle to mutex
                                            INFINITE // no time-out interval
    										);
     
        /*if (ReleaseMutex (SemMutex) != 0)
        {
            err = 1;
        }
     
        if (CloseHandle (SemMutex) != 0)
        {
            err = 1;
        }*/
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
    	HANDLE HandleTh1;
    	HANDLE HandleTh2;
    	DWORD ECRthreadID1;
    	DWORD ECRthreadID2;
     
    	HandleTh1 = CreateThread (NULL, //Choose default security
                                          0, //Default stack size
                                          (LPTHREAD_START_ROUTINE) &Funct1, //Routine to execute
                                          NULL, // No parameter
                                          0, // Immediately run the thread
                                          &ECRthreadID1 //Thread Id
                                          );
     
    	HandleTh1 = CreateThread (NULL, //Choose default security
                                          0, //Default stack size
                                          (LPTHREAD_START_ROUTINE) &Funct2, //Routine to execute
                                          NULL, // No parameter
                                          0, // Immediately run the thread
                                          &ECRthreadID2 //Thread Id
                                          );
     
    	Sleep (30000);
     
    	return 0;
    }
    Est ce que quelqu'un peux m'aider?
    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 487
    Par défaut
    Vérifiez la valeur de retour "dwWaitResult", svp.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Il y a un exemple d'utilisation des mutex ici :

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Le problème que je vois c'est que le mutex est créé deux fois. Donc le handle du premier appel est perdu au deuxième appel. Ce n'est plus le même sémaphore et il y a une fuite de mémoire.

    Plutôt un truc de ce genre :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    // TestMutex.cpp : Defines the entry point for the console application.
    //
     
    #include <stdio.h>
    #include <winsock2.h>
    #include <WinBase.h>
     
    HANDLE SemMutex;
     
    void Funct1 (void){
     
      int err = 0;
      DWORD dwWaitResult;	
     
      if(SemMutex == NULL){
        // An error has occurred
        err = 1;
      }
     
      dwWaitResult = WaitForSingleObject (SemMutex, // handle to mutex
    				INFINITE // no time-out interval
    				);
     
      /*if (ReleaseMutex (SemMutex) != 0)
      {
         err = 1;
      }
     
      if (CloseHandle (SemMutex) != 0)
      {
        err = 1;
       }*/
    }
     
    void Funct2 (void){
     
      int err = 0;
      DWORD dwWaitResult;
     
      Sleep (2000);
     
      if(SemMutex == NULL){
        // An error has occurred
        err = 1;
      }
     
      dwWaitResult = WaitForSingleObject (SemMutex, // handle to mutex
    			          INFINITE // no time-out interval
      			);
     
      /*if (ReleaseMutex (SemMutex) != 0)
      {
         err = 1;
      }
     
      if (CloseHandle (SemMutex) != 0)
      {
         err = 1;
       }*/
    }
     
    void main(){
     
      HANDLE HandleTh1;
      HANDLE HandleTh2;
      DWORD ECRthreadID1;
      DWORD ECRthreadID2;
     
      SemMutex = CreateMutex (NULL, // default security attributes
                              FALSE, // initially not owned
         	      NULL // unnamed mutex
      	);
     
      HandleTh1 = CreateThread (NULL, //Choose default security
                                          0, //Default stack size
                                          (LPTHREAD_START_ROUTINE) &Funct1, //Routine to execute
                                          NULL, // No parameter
                                          0, // Immediately run the thread
                                          &ECRthreadID1 //Thread Id
                                          );
     
      HandleTh2 = CreateThread (NULL, //Choose default security
                                          0, //Default stack size
                                          (LPTHREAD_START_ROUTINE) &Funct2, //Routine to execute
                                          NULL, // No parameter
                                          0, // Immediately run the thread
                                          &ECRthreadID2 //Thread Id
                                          );
     
      Sleep (30000);
    }
    Ici la fonction 2 se bloque bien par ce que la fonction 1 ne Release pas le sémaphore.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Par défaut
    Merci moldavi pour la réponse mais je pense que CreateMutex () crée une semaphore s'il n'existe pas sinon elle renvoie le même handle qui a été créé.
    En fait j'ai essayé d'exécuter le code avec la modification que tu as fournis mais malheureusement toujours le même problème persiste.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Par défaut
    La fonction dwWaitResult() retourne toujours la valeur 0. Je pense que c'est WAIT_OBJECT_0 (The state of the specified object is signaled).

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par midou256 Voir le message
    Merci moldavi pour la réponse mais je pense que CreateMutex () crée une semaphore s'il n'existe pas sinon elle renvoie le même handle qui a été créé.
    Seulement s'il est nommé. Si tu ne lui passes aucun nom, CreateMutex() crée à chaque fois un nouveau mutex anonyme.

    PS: Mutex et sémaphore sont deux choses différentes.
    PPS: Cette question n'a rien à voir avec le Framework .Net ou le langage C++/CLI.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre confirmé
    Inscrit en
    Février 2010
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 103
    Par défaut
    Ah ok
    Mais le problème persiste meme si je fais une seul appel de la fonction CreateMutex ().

Discussions similaires

  1. Probleme de gestion de base de donnees SQL
    Par Nonold dans le forum C++
    Réponses: 2
    Dernier message: 15/03/2005, 16h18
  2. [Oracle]probleme de gestion des utilisateurs
    Par gentarik dans le forum Oracle
    Réponses: 5
    Dernier message: 09/03/2005, 12h58
  3. gestion de semaphore sous builder
    Par buzzz dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/02/2005, 12h43
  4. [TP]Probleme de gestion d'écriture écran
    Par @tom@ dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 22/12/2003, 20h49
  5. probleme de gestion de clients avec des sockets....
    Par ludvo dans le forum Réseau
    Réponses: 6
    Dernier message: 25/09/2003, 12h37

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