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

Multithreading Discussion :

Problème de mutex [Protection de données]


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Par défaut Problème de mutex
    Bonjour,

    Je lance plusieurs threads en parallèle qui travaillent à partir d'une liste. Cette liste est protégée par un QMutex, mais malgré cela mes quatre threads traitent la même première occurrence et ne vident pas la liste.

    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
    class Thread : public QThread
    {
    	Q_OBJECT
    public:
    	Thread(QStringList&, int);
     
     
    protected:
    	void run();
     
    private:
    	QStringList Liste;
    	int num_thread;
    	volatile bool stopped;
    	QMutex mutexListe;
    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
    Thread::Thread(QStringList & list, int i)
    {
      stopped = false;
      Liste = list;
      num_thread = i;
    }
     
    void Thread::run()
    {
    	qDebug() << "Thread " << num_thread;
     
      forever {
        mutexListe.lock();
        int nb;
        if (!Liste.isEmpty()) {
           QString jobname(Liste.first());
           Liste.removeFirst();
           nb = Liste.size();
           mutexListe.unlock();
           //Mon code QProcess
           qDebug() << "Taille liste = " << nb << "  sur " << num_thread;
           qDebug() << "Lancement " << jobname << " sur " << num_thread;
    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
     #include <QApplication>
     
     #include "Thread.h"
     
     int main(int argc, char *argv[])
     {
         QApplication app(argc, argv);
     
      int noeuds(4);
      QStringList Liste;
      Liste << "SCD1LoadDimSSKsFromDimAndFact" << "SCD1LoadFactSSKs" << "SCD1LoadTargetTable" << "SCD1Lookups1" << "SCD1Lookups10" << "SCD1Lookups2";
     
      for (int i(0) ; i < noeuds ; ++i)
      {
      	Thread * un_thread;
      	un_thread = new Thread(Liste, i);
      	un_thread->start();
      }  
     
      return 0;
     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Thread  0
    Thread  1
    Thread  3
    Thread  2
    Taille liste =  5   sur  0
    Taille liste =  5   sur  1
    Taille liste =  5   sur  2
    Taille liste =  5   sur  3
    Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  0
    Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  2
    Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  1
    Lancement  "SCD1LoadDimSSKsFromDimAndFact"  sur  3

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Par défaut
    je n'ai jamais fait de multi process....
    mais
    a priori le mutex empeche plusieurs threads de passer dans le même code.
    Or ici tu as une instance de mutex pour chaque thread, donc le lock ne concerne que le thread en question....

    Le mutex devrait être mis dans un objet encapsulant ta liste....
    les modifications de valeurs seraient alors effectuées par un thread en même temps

    à vérifier bien sûr

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Par défaut
    J'ai mis le mutex dans les données membres du thread comme c'est fait dans le livre Qt4 et C++.
    J'ai essayé en mettant le mutex en variable globales mais j'ai une erreur à la compilation.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    democrie a raison, mutexListe étant une variable de classe non statique, il en existe autant que d'instance de la classe... donc ton mutex ne sert à rien.

    Pour que ce soit correct, il faut mettre mutexListe en static...

    Si ça ne compile toujours pas, montre les erreurs...

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Fabllot Voir le message
    Bonjour,

    democrie a raison, mutexListe étant une variable de classe non statique, il en existe autant que d'instance de la classe... donc ton mutex ne sert à rien.

    Pour que ce soit correct, il faut mettre mutexListe en static...
    C'est une solution.
    Par contre,il fait la même erreur avec la liste. Chaque thread à sa propre liste....

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Par défaut
    Si je mets mutexListe en static j'ai l'erreur de compilation suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
    oc -Wl,-subsystem,console -mthreads -Wl -o debug\QThread.exe debug/main.o debug/
    Thread.o debug/moc_Thread.o  -L"c:\Qt\qt\lib" -lQtGuid4 -lQtCored4
    debug/Thread.o(.text+0x542): In function `ZN6Thread3runEv':
    L:/CPP/Qt/QThread/Thread.cpp:18: undefined reference to `Thread::mutexListe'
    debug/Thread.o(.text+0x5b6):L:/CPP/Qt/QThread/Thread.cpp:24: undefined reference
     to `Thread::mutexListe'
    debug/Thread.o(.text+0x1035):L:/CPP/Qt/QThread/Thread.cpp:40: undefined referenc
    e to `Thread::mutexListe'
    collect2: ld returned 1 exit status
    mingw32-make[1]: *** [debug\QThread.exe] Error 1
    mingw32-make[1]: Leaving directory `L:/CPP/Qt/QThread'
    mingw32-make: *** [debug] Error 2
    Pourquoi chaque thread aurait sa liste puisque je passe laliste par référence au constructeur ?

+ 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. problème de mutex et de condition
    Par mitmat dans le forum SDL
    Réponses: 4
    Dernier message: 03/04/2008, 17h25
  4. problème de mutex
    Par ep31 dans le forum MFC
    Réponses: 2
    Dernier message: 07/04/2006, 11h28
  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