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

Threads & Processus C++ Discussion :

OpenThreads et mutex


Sujet :

Threads & Processus C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut OpenThreads et mutex
    Bonjour à tous,

    Je rencontre quelques soucis avec l'utilisation de la librarie OpenThreads (composant d'OpenSceneGraph) et la documentation étant très peu fournie, je me demandais si quelqu'un ici pouvait m'aider.

    Le problème est tout simple : le "lock" que je fais sur un mutex n'est pas bloquant et toujours valide. Je n'arrive pas à comprendre pourquoi.

    Par exemple le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    OpenThreads::Mutex mutex;
     
    mutex.lock(); // Là tout devrait fonctionner
    mutex.lock(); // Là je devrais être bloqué ou l'instruction devrait échouer
    int a = 3;    // Bizarrement cette instruction est éxécutée
    J'ai utilisé un peu pthread auparavant et il me semblait que lorsqu'on faisait un lock sur un mutex, l'instruction était bloquante, c'est bien ça ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Sous certains systèmes, les mutexes autorisent le verrouillage récursif au sein d'un même thread, pour éviter qu'un thread se mette en "étreinte fatale" à lui tout seul.
    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.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut
    Mais dans ce cas, comment tester que les mutexes sont verrouillés ? Ici les instructions me retournent toutes deux zéro.

    Ce n'est qu'en utilisant des conditions que j'arrive à bloquer le thread en attente du mutex...

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Mais dans ce cas, pourquoi tester que les mutexes sont verrouillés? Le thread qui a verrouillé un mutex le sait, et il n'a qu'à le mémoriser dans une variable locale.
    Les autres threads le sauront quand ils essaieront à leur tour d'acquérir le mutex, vu que eux bloqueront ou échoueront (normalement, tu dois aussi avoir une version non-bloquante de la fonction de verrouillage, du genre trylock() ou une version avec timeout de lock()...)
    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.

  5. #5
    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 Sleev Voir le message
    Ce n'est qu'en utilisant des conditions que j'arrive à bloquer le thread en attente du mutex...
    Je ne comprends pas cette phrase, c'est exactement le rôle du mutex lorsqu'on appelle lock() que de bloquer le thread d'où a été fait l'appel jusqu'à ce que le mutex se libère.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut
    Justement, mon problème est que l'appel à lock() ne bloque rien du tout. Que ce soit dans un unique thread ou dans deux différents.

    Mais je m'explique. En fait je souhaite faire un programme ou deux threads écrivent dans la console l'un après l'autre. Sachant qu'un thread ne peux pas écrire deux fois de suite. Voila mon 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
    55
    56
    57
    58
    59
    60
    61
    #include <cstdlib>
    #include <ctime>
    #include <iostream>
    #include <OpenThreads/Condition>
    #include <OpenThreads/Mutex>
    #include <OpenThreads/ReadWriteMutex>
    #include <OpenThreads/Thread>
    #include <string>
     
    class MessageThread : public OpenThreads::Thread
    {
    	public:
    		MessageThread(const std::string &message, OpenThreads::Mutex *mutex1, OpenThreads::Mutex *mutex2) : OpenThreads::Thread()
    		{
    			mMessage = message;
    			mMutex1 = mutex1;
    			mMutex2 = mutex2;
    		}
     
    		virtual ~MessageThread()
    		{
    			this->cancel();
    		}
     
    		virtual void run()
    		{
    			if (mMutex1 == NULL || mMutex2 == NULL)
    				return;
     
    			while (true)
    			{
    				mMutex1->lock();
    				std::cout << mMessage << std::endl;
    				OpenThreads::Thread::microSleep((rand() % 4) * 500000);
    				mMutex2->unlock();
    			}
    		}
     
    	protected:
    		std::string mMessage;
    		OpenThreads::Mutex *mMutex1;
    		OpenThreads::Mutex *mMutex2;
    };
     
    int main(int argc, char **argv)
    {
    	srand(time(NULL));
     
    	OpenThreads::Mutex m1;
    	OpenThreads::Mutex m2;
     
    	MessageThread thread("Hello", &m1, &m2);
    	MessageThread thread2("World", &m2, &m1);
     
    	thread.start();
    	thread2.start();
     
    	OpenThreads::Thread::microSleep(100000000);
     
    	return 0;
    }
    Cela devrait marcher non ? Sauf qu'au final, l'appel à lock() produit le même effet qu'un trylock() et mes deux threads écrivent un peu quand ils veulent dans la console...

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    C'est normal, vu ce que j'ai dit à propos des locks récursifs et le fait que tes deux threads utilisent des mutexes différents.

    Tu devrais utiliser autre chose à la place, genre des sémaphores ou des événements.
    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.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 4
    Par défaut
    Effectivement, je viens de tester avec un même mutex pour des threads différents, le lock() fonctionne. C'est donc bien que le thread ne peut pas s'auto-bloquer...

    Merci de ton aide, j'aurais mis du temps à comprendre mon problème sans cela !

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

Discussions similaires

  1. mutex windows
    Par niglo dans le forum Windows
    Réponses: 2
    Dernier message: 04/05/2005, 10h28
  2. Mutex sous windows
    Par gregfly26 dans le forum C++Builder
    Réponses: 10
    Dernier message: 13/04/2005, 13h30
  3. pthread et mutex
    Par Nico65 dans le forum C++
    Réponses: 20
    Dernier message: 16/01/2005, 12h30
  4. Gestion de mutex
    Par salammbo dans le forum GLUT
    Réponses: 1
    Dernier message: 22/12/2004, 10h19
  5. Utilisation des Mutex
    Par jordy16 dans le forum C++Builder
    Réponses: 3
    Dernier message: 09/12/2004, 09h02

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