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++

  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.

  7. #7
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,

    Citation Envoyé par Flo
    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.
    Dans ce cas la primitive de synchronisation appropriée me semble être la barrière : Une barrière est un point de synchronisation entre plusieurs threads. Elle est configurée pour bloquer un certain nombre de thread (n). Au départ la barrière est dans un état fermée et lorsqu'un thread arrive sur cette barrière, il doit attendre que les n autres threads arrivent à leur tour sur la barrière. Une fois que les n thread ont atteint la barrière, la barrière s'ouvre, les threads repartent et passent la barrière, puis la barrière se referme à nouveau.

    Boost fournit une implémentation toute prête de barrière dans <boost/thread/barrier.hpp>

    L'interface est volontairement simpliste et le code est très simple. C'est un bon point de départ pour créer un composant plus évolué, si besoin il y a.

  8. #8
    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
    Merci, c'est exactement ce que je voulais.

    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