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

Boost C++ Discussion :

Tester si un mutex est bloqué


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut Tester si un mutex est bloqué
    Bonjour,

    le code suivant utilise-t-il la bonne méthode pour vérifier si un mutex est bloqué ou pas ?

    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
    bool isMutexLocked(boost::mutex & mutex)
    {
    	bool locked = false;
     
    	// try blocking the mutex
    	{
    		boost::mutex::scoped_lock lock(mutex, boost::try_to_lock); 
    		if(lock.owns_lock())
    		{
    			locked = false;
    		}
    		else
    		{
    			locked = true;
    		}		
    	}
     
    	return locked;
    }
    Merci

    Flo.

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    A quoi ça sert? La réponse peut-être fausse dés la sortie de la fonction.

  3. #3
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    Oui je sais.

    Bon alors je mets un exemple plus concret.

    Voici la classe Process

    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
    class Process
    {
    	mutable boost::mutex _mutex;
     
    	boost::condition _condition;
     
    public:
     
    	boost::signals2::signal<void ()> _onWaiting;
     
    	void run()
    	{
    		while(une_condition)
    		{
    			// ... on fait le taf
     
    			// je lance un thread qui va envoyer le signal _onWaiting 
    			// lorsque le mutex sera bloqué (signe qu'on est dans le
    			// "wait" de la boost::condition)
    			boost::thread(boost::bind(&Process::checkState, this));
     
    			// en attente
    			{
    				boost::mutex::scoped_lock guard(_mutex);
    				_condition.wait(guard);			
    			}
    		}
    	}
     
    	bool isWaiting()
    	{
    		// try blocking the mutex
    		{
    			boost::mutex::scoped_lock lock(_mutex, boost::try_to_lock); 
    			if(lock.owns_lock())
    			{
    				// si on est parvenu à bloquer le mutex
    				// alors on n'est pas dans le "wait" de la 
    				// boost::condition
    				return false;
    			}	
    		}
     
    		return true;
    	}
     
    	void release()
    	{
    		_condition.notify_all();
    	}
     
    private:
     
    	void checkState()
    	{
    		do
    		{		
    			// on attend avant de tester le mutex à nouveau
    			boost::this_thread::sleep(boost::posix_time::milliseconds(10)); 
    		}
    		while(!isWaiting());
     
    		_onWaiting();
    	}
    }; // Process
    Et voilà le 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
    24
    25
    Process p1;
    Process p2;
    Process p3;
     
    void testState()
    {
    	// une fois que les 3 threads sont en attente
    	if(p1.isWaiting() && p2.isWaiting() && p3.isWaiting())
    	{
    		// on les libère	
    		p1.release();
    		p2.release();
    		p3.release();
    	}
    }
     
    int main()
    {
    	p1._onWaiting.connect(boost::bind(testState));
    	p2._onWaiting.connect(boost::bind(testState));
    	p3._onWaiting.connect(boost::bind(testState));
    	p1.run();
    	p2.run();
    	p3.run();
    }
    En bref, c'est pour synchroniser plusieurs threads que j'ai procédé ainsi. Mais la fonction owns_lock() me renvoie toujours true alors que je suis bien bloqué dans le "wait" de ma boost::condition.

    Pas taper hein ! Si y a mieux (et j'en doute pas) pour faire la même chose, je suis preneur.

    Flo.

  4. #4
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    En scrutant la doc de plus près, j'ai compris que le mutex est débloqué par la méthode wait du boost::condition. Donc mon test ne vaut rien.

    En attendant une meilleure solution, j'ai utilisé un booléen
    • qui passe à true avant de faire le wait
    • qui passe à false après le notify_all
    • qui est retourné par la fonction isWaiting()

    Chacune des 3 opérations étant protégée par un 2ième mutex.

    Ya pas mieux comme solution ?

    Flo.

  5. #5
    Membre émérite
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2009
    Messages
    552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 552
    Par défaut
    Bonsoir,

    Je ne suis pas un gros expert en thread, mais lock est plutôt là pour entourer l'accès à une variable partagée en accès concurrent (quand on a rien de mieux)

    Pour synchroniser plusieurs thread, vous n'auriez pas plutôt besoin d'un join()?

  6. #6
    Membre chevronné Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Par défaut
    En fait , j'ai plusieurs threads. Dans chacun des threads, j'ai une boucle while. Je veux qu'à la fin de chaque boucle, tous les threads s'attendent.

    Flo.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/09/2014, 11h32
  2. Tester si un port est bloqué via Dos
    Par justgreat dans le forum Sécurité
    Réponses: 10
    Dernier message: 06/04/2007, 01h41
  3. tester si un fichier est bloqué
    Par trole dans le forum C++
    Réponses: 4
    Dernier message: 02/08/2006, 22h46
  4. Tester si un champ est NULL
    Par titititi007 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/06/2003, 10h17
  5. tester si une date est valide
    Par Andry dans le forum Langage
    Réponses: 5
    Dernier message: 17/09/2002, 11h54

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