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

MFC Discussion :

problème de mutex


Sujet :

MFC

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut problème de mutex
    J'ai deux exe, chacun essayant d'accéder à une ressource partagée.
    J'ai une méthode de réservation de la ressource :
    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
     
    bool Mutex::_WaitFor ()
    {
    	try {
    		DWORD dwWaitResult = WaitForSingleObject (m_Mutex, m_WaitingForMutex);
    		switch (dwWaitResult)
    		{
    			case WAIT_OBJECT_0 :
    				m_CurrentErr = "";
    				return true;
    			case WAIT_TIMEOUT :
    				throw ExceptionWaitTimeOutMutex();
    			case WAIT_FAILED :
    				throw ExceptionWaitFailedMutex();
    			default :
    				throw ExceptionUnknowMutex();
    		}
    	}
    	catch (ExceptionWaitTimeOutMutex e) {
    		m_CurrentErr = e.GetError();
    		return false;
    	}
    	catch (ExceptionWaitFailedMutex e) {
    		m_CurrentErr = e.GetError();
    		return false;
    	}
    	catch (ExceptionUnknowMutex e) {
    		m_CurrentErr = e.GetError();
    		return false;
    	}
    	catch (...) {
    		m_CurrentErr = static_cast<CString>("Could not access to mutex");
    		return false;
    	}
    }
    et une pour la libération :
    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
     
    bool Mutex::Release ()
    {
    	try {
    		BOOL	bReleased = FALSE;
    		if ((bReleased =ReleaseMutex(m_Mutex)) == TRUE) 
    			bReleased = CloseHandle (m_Mutex);
    		if (bReleased == FALSE)
    			m_CurrentErr = static_cast<CString>("Could not release mutex");
    		m_Mutex = 0;
    		return true ? bReleased == TRUE : false;
    	}
    	catch (...) {
    		m_CurrentErr = static_cast<CString>("Could not release mutex");
    		return false;
    	}
    }
    Je lance mes deux exe (e1 et e2) en parallèle.
    _ e2 essaie de réserver la ressource partagée alors que e1 est en train d'y travailler dessus (donc ne l'a pas libérée mais l'a réservée). e1 libère la resource (par Release()) mais e2 ne peut toujours pas y accéder. Il attend que l'exécutable e1 ait fini son traitement et se kille pour pouvoir réserver la ressource.
    _ Par contre, si e1 réserve la resource et la libère, e2 peut la réserver et l'utiliser ; e1 peut ensuite la réserver puis la libérer, ...
    Si un de mes exe réserve la resource et la libère, un autre process peut y accèder. Par contre, si un exe essaie d'y accèder alors que l'autre ne l'a pas libérée ; alors le process attendant la resource est obligé d'attendre que l'autre process soit totalement fini.

    J'ai été clair j'espère ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    Au fait, ma question est : qu'est-ce qu'il faut ajouter comme option (lors du CreateMutex ou de l'OpenMutex) pour éviter ce problème svp ?
    D'ailleurs voilà la méthode de création du mutex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bool Mutex::_Open ()
    {
    	try {
    		if (m_Mutex == 0) 
    			if (!(m_Mutex = OpenMutex (SYNCHRONIZE, TRUE, m_MutexName))) 
    				m_Mutex = CreateMutex (NULL, FALSE, m_MutexName);
    		return true;
    	}
    	catch (...) {
    		return false;
    	}
    }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Par défaut
    OK, c'était l'appel succéssif à WaitForSingleObject qui considérait que je prenais plusieurs jetons apparement.

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

Discussions similaires

  1. Problème de Mutex
    Par sinfoni dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 07/12/2010, 18h09
  2. Problème de mutex en mode release
    Par fredppp dans le forum C++/CLI
    Réponses: 3
    Dernier message: 05/11/2010, 20h26
  3. [Protection de données] Problème de mutex
    Par DSGSLA dans le forum Multithreading
    Réponses: 11
    Dernier message: 04/02/2010, 16h34
  4. problème de mutex et de condition
    Par mitmat dans le forum SDL
    Réponses: 4
    Dernier message: 03/04/2008, 17h25
  5. Problème de mutex avec Waitforsingleobject non-bloquant
    Par rvzip64 dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 03/11/2005, 11h02

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