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 :

Partage de conteneur


Sujet :

Multithreading

  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 Partage de conteneur
    Bonjour à tous,

    J'ai lu que le conteneur Qqueue est ré-entrant et que c'est plus "fort" que safe-thread.
    Deux threads différents partageant un pointeur vers un Qqueue peuvent-ils l'un faire des enqueue() et l'autre des dequeue() sans besoin d'utiliser une technique de synchronisation (mutex, sémaphore) ?

  2. #2
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Salut,

    Pour moi si tu as une Qqueue partager entre 2 threads tu dois protéger l’accès via de la synchro sinon tu risques d'avoir des problèmes.

    Regarde ce lien ici.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  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
    Merci pour le lien, c'est plus clair.
    Donc Qqueue est ré-entrant mais pas thread-safe.
    Existe-il des conteneurs Qt qui soient thread-safe ?

    Quel problème pourrai-t-on avoir, on accède jamais simultanément au même élément de la file ?

  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 : 44
    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 DSGSLA Voir le message
    J'ai lu que le conteneur Qqueue est ré-entrant et que c'est plus "fort" que safe-thread.
    QUi t'as dit cela

    Citation Envoyé par DSGSLA Voir le message
    Quel problème pourrai-t-on avoir, on accède jamais simultanément au même élément de la file ?
    Un gros plantage ou erreur mémoire lors d'un push et pop par deux thread différent.

    Que cherche tu as faire?

  5. #5
    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
    Je veux envoyer (unidirectionnel) des Qvariant (donc de taille variable) d'un thread à un autre.

  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 : 44
    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 DSGSLA Voir le message
    Je veux envoyer (unidirectionnel) des Qvariant (donc de taille variable) d'un thread à un autre.
    Pourquoi ne pas utiliser les signal/slot?

  7. #7
    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
    Pourquoi ne pas utiliser les signal/slot?
    Parce que le type de classes thread et leur nombre est variable. Je ne peut les déterminer qu'à l'exécution. Comment effectuer les connect dans ce cas ?
    De plus les threads peuvent être chaînés, comment synchroniser les flux entrants et sortant ainsi que les calculs à faire ?

  8. #8
    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 : 44
    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 DSGSLA Voir le message
    Parce que le type de classes thread et leur nombre est variable. Je ne peut les déterminer qu'à l'exécution. Comment effectuer les connect dans ce cas ?
    De plus les threads peuvent être chaînés, comment synchroniser les flux entrants et sortant ainsi que les calculs à faire ?
    peut tu expliquer un peu le problème.

    Peut être que qreadwritelock peut t'aider
    http://qt.developpez.com/doc/latest/qreadwritelock.html

    Connais tu QtConcurrent?

  9. #9
    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
    Je vais essayer de présenter l'architecture de l'application.
    Le programme est lancé avec un grand nombre de paramètres. A partir de ceux-ci il détermine un graphe dont les nœuds sont des threads variés. Les branches sont orientées (unidirectionnelles) et sont des tunnels de données de longueur variables. Les nœuds sont donc producteurs ou consommateurs ou producteurs et consommateurs.

  10. #10
    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 : 44
    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
    Ok.
    As tu regardé ces exemples?
    http://qt.developpez.com/doc/latest/...emaphores.html
    http://qt.developpez.com/doc/latest/...onditions.html

    Unn truc qui pourrai être intéressant :
    * Chaque noeud est un QObject qui :
    - stock ce qu'il va consommer
    - reçois les données à consommer par un slot
    - envoyé les données produite par un signal
    * chaque QObject est associé à un QThread qui lance une eventloop

    Ainsi chaque branch correspond à une connexion.

  11. #11
    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
    Mais à chaque emit reçu je sors de ma boucle de traitement, non ?
    Et comment faire les connect ?

    Autrement un QVector peut-il être lu et écrit en même temps ? Tant que l'on accède à un occurrence qui existe.

  12. #12
    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 : 44
    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
    Mais à chaque emit reçu je sors de ma boucle de traitement, non ?
    pourquoi?
    Et comment faire les connect ?
    quand tu créé ton graph, tu peut creer tes connect entre les noeud (QObject).
    Un autre avantage ( si c'est cohérent à ton besoin) c'est que tu pourra mettre plusieurs noeud dans un même thread et éviter de creer trop de thread.

    Citation Envoyé par DSGSLA Voir le message
    Autrement un QVector peut-il être lu et écrit en même temps ? Tant que l'on accède à un occurrence qui existe.
    oui et non.
    S'il la taille tu vecteur ne change pas tu peux y accéder en Parallèle en lecture. Si sur une même occurrent un thread la modifie et un autre la li, il faut protéger.
    Le QReadWriteLock peut t'aider si plusieurs threads accèdent au données en lecture.

  13. #13
    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
    oui et non.
    S'il la taille tu vecteur ne change pas tu peux y accéder en Parallèle en lecture. Si sur une même occurrent un thread la modifie et un autre la li, il faut protéger.
    Justement, si le consommateur connaît la dernière occurrence "autorisée" il peut lire pendant que le producteur rajoute de nouvelles occurrences. Non ?

    Mais à chaque emit reçu je sors de ma boucle de traitement, non ?
    pourquoi?
    Si je suis dans une boucle de calculs sur les données déjà lues, à chaque fois qu'un signal du producteur est reçu la fonction SLOT prends la main. Et que se passe-t-il après ?

  14. #14
    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 : 44
    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 DSGSLA Voir le message
    Justement, si le consommateur connaît la dernière occurrence "autorisée" il peut lire pendant que le producteur rajoute de nouvelles occurrences. Non ?
    Si le rajout modifie la taille du vecteur, il risque d’avoir réallocation et ton thread qui consomme risque de manipuler un truc qui est détruit => erreur mémoire

    Citation Envoyé par DSGSLA Voir le message
    Si je suis dans une boucle de calculs sur les données déjà lues, à chaque fois qu'un signal du producteur est reçu la fonction SLOT prends la main. Et que se passe-t-il après ?
    Le slot ne sera exécuté uniquement lorsque l'eventloop du thread le peux. Pour que cela marche, il faut que ton algo exploite l'eventloop à chaque Noeud.

  15. #15
    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
    Le slot ne sera exécuté uniquement lorsque l'eventloop du thread le peux. Pour que cela marche, il faut que ton algo exploite l'eventloop à chaque Noeud.
    Je ne comprends pas, désolé. Je ne connais pas la notion d'eventloop.

  16. #16
    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 : 44
    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 DSGSLA Voir le message
    Je ne comprends pas, désolé. Je ne connais pas la notion d'eventloop.
    http://qt.developpez.com/doc/latest/...ndfilters.html

  17. #17
    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
    Les signaux sont fonctionnent sur la même base que les events ?
    Je ne vois pas comment gérer les signaux en même temps que la boucle de traitement des données.

  18. #18
    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 : 44
    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 DSGSLA Voir le message
    Les signaux sont fonctionnent sur la même base que les events ?
    Je ne vois pas comment gérer les signaux en même temps que la boucle de traitement des données.
    Quand tu connecte un signal et un slot entre deux QObject appartenant à deux QThread différent, l'eventloop est utilisé pour que le slot soit exécuté dans le bon thread.

    C'était un proposition, mais si ce que font tes noeud n'est pas compatible avec l'utilisation d'une event loop, cela n'ira pas.

    Il te reste donc à protéger les accès à tes QVector.

  19. #19
    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
    Merci pour tes réponses.
    Je vais commencer un proto.
    Je clos donc le fil.

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

Discussions similaires

  1. [Kylix] partager fonctions
    Par RezzA dans le forum EDI
    Réponses: 1
    Dernier message: 16/03/2003, 17h02
  2. [VB6] [Réseau] Connexion et partage de données
    Par tomnie dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 21/10/2002, 19h12
  3. Partager son disque
    Par tintin22 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 16/09/2002, 01h34
  4. Réponses: 4
    Dernier message: 13/05/2002, 17h43
  5. Peux t'on créer une copie locale de l'objet partagé?
    Par Anonymous dans le forum CORBA
    Réponses: 8
    Dernier message: 16/04/2002, 17h20

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