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 :

Moyen le plus simple pour paralléliser avec données partagées


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut Moyen le plus simple pour paralléliser avec données partagées
    Bonjour,
    Désolé de ce titre un peu vague. J'ai lu la doc (et le tuto de yan) sur les threads, mais jamais pratiqué. Je me demande ce qui est le plus simple dans mon cas :
    J'ai un traitement à faire sur plusieurs fichiers, qui modifiera une classe au fur et à mesure de l'avancement, et lira/écrira des données dans une autre classe (interfaçant une base de données). Le traitement a ses propres données temporaires et peut être parallélisé, par contre l'accès aux autres classes non, leurs données sont partagées.
    Je voudrais utiliser au maximum les capacités de la machine (potentiellement un serveur avec beaucoup de coeurs), et lancer autant de traitements en parallèle que possible.

    QtConcurrent semble le plus simple à utiliser, pour gérer automatiquement le nombre de threads à créer etc. Mais je ne comprends pas bien comment créer une ressource commune.
    Donc je me dis que ça n'est pas assez adaptable, et qu'il faut plutôt partir sur QThreadPool, créer mes classes de ressources avec QMutex, puis gérer les appels au mutex dans le traitement héritant de QRunnable.

    Si quelqu'un avec de l'expérience pouvait brièvement m'indiquer la meilleure voie à suivre, je saurais dans quelle direction me lancer ^^
    merci d'avance !

  2. #2
    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
    Salut
    Citation Envoyé par ymoreau Voir le message
    J'ai un traitement à faire sur plusieurs fichiers, qui modifiera une classe au fur et à mesure de l'avancement, et lira/écrira des données dans une autre classe (interfaçant une base de données). Le traitement a ses propres données temporaires et peut être parallélisé, par contre l'accès aux autres classes non, leurs données sont partagées
    Peut être créer un QObject par module de traitement et les répartir entre plusieur QThread? Ainsi la communication se fera par les Signal/Slot. Et tu pourra répartir les charges entre différent QThread (et ainsi limiter le nombre de thread).

    Ton problème ressemble à un problème de producteur/commateur :
    http://qt-project.org/doc/qt-4.8/thr...emaphores.html
    http://qt-project.org/doc/qt-4.8/thr...onditions.html


    Je voudrais utiliser au maximum les capacités de la machine (potentiellement un serveur avec beaucoup de coeurs), et lancer autant de traitements en parallèle que possible.
    Ca va dépendre de ce que tu entend par parallèle.
    Si ce sont de petit traitement, tu peut généralement les regrouper dans un même thread.
    Si se sont de gros traitement, un nombre de thread au dessus du nombre de coeurs ralentira certainement tous les traitements parallèle.

  3. #3
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Merci de ta réponse !
    En fait il n'y qu'un (potentiellement gros) traitement qui travaille sur un fichier, il ne peut pas être subdivisé. Par contre, je dois traiter beaucoup de fichiers et j'aimerais dupliquer le traitement sur plusieurs threads où chaque instance s'occuperait de son propre fichier.
    Donc si j'ai bien compris, il n'y a que des producteurs qui ne dépendent pas les uns des autres, mais qui ont besoin de ces ressources communes (totalement indépendantes de l'état du traitement). En pratique lire des infos dans un tampon partagé, et rajouter quelques infos à ce tampon quand il y en a de nouvelles. Pour le reste chaque instance de traitement lit son propre fichier, et écrit ses propre données de résultat.

    Et je comptais justement créer autant de threads que de coeurs disponibles (moins un pour la boucle principale d'évènements).

  4. #4
    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 ymoreau Voir le message
    Par contre, je dois traiter beaucoup de fichiers et j'aimerais dupliquer le traitement sur plusieurs threads où chaque instance s'occuperait de son propre fichier.
    C'est à dire?

  5. #5
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Disons une fonction prenant un nom de fichier en argument, créant des données temporaires avec le contenu du fichier, puis envoyant tout ça dans une base de données. On peut appeler cette fonction plusieurs fois en parallèle avec à chaque fois un des fichiers de la liste à traiter, puisque les données d'entrée et les données sortantes sont propre à chaque fichier.
    Sauf que ce traitement va aussi avoir besoin de données communes à tous les fichiers, en lecture et parfois en écriture.

    Donc en gros, j'aurais une ressource commune avec un mutex, et plusieurs instances de la fonction de traitement.

  6. #6
    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
    Pour la lecture des fichiers, c'est surtout l’accès du fichier qui va prendre du temps. Donc tu ne va pas pouvoir beaucoup (et se sera surement le contraire) accélérer la lecture en utilisant plusieurs thread.

    Si j'ai bien compris, tu as un module qui ne fait que lire un fichier pour récupéré des données et un module qui exploite les données lue.
    C'est bien cela?


    pourquoi?
    données communes à tous les fichiers
    En alternative au mutex, regarde les readwritelock
    http://qt-project.org/doc/qt-4.8/qreadwritelock.html

    Et au lieu d'utiliser les mutex directement regarde :
    http://qt-project.org/doc/qt-4.8/qmutexlocker.html
    http://qt-project.org/doc/qt-4.8/qreadlocker.html
    http://qt-project.org/doc/qt-4.8/qwritelocker.html

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/06/2014, 13h08
  2. moyen le plus simple pour Historiser
    Par AmauryLondon dans le forum Excel
    Réponses: 1
    Dernier message: 22/05/2012, 21h22
  3. [Quartz] Quartz 2D le moyen le plus simple pour les images
    Par NiamorH dans le forum Développement OS X
    Réponses: 6
    Dernier message: 02/05/2007, 17h34
  4. Réponses: 1
    Dernier message: 27/03/2007, 18h22
  5. Réponses: 11
    Dernier message: 13/07/2006, 16h15

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