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 :

Multi thread et QSharedPointer


Sujet :

Multithreading

  1. #1
    Invité
    Invité(e)
    Par défaut Multi thread et QSharedPointer
    Bonjour à tous,

    J'aurais besoin de l'avis d'experts, car je ne suis pas certain d'avoir bien compris ce que j'ai lu.

    Mon application doit, entre nombreuses autres choses, communiquer en série avec un périphérique externe.

    J'utilise donc un objet QSerialPort. Il est créé et encapsulé par une instance d'une classe à moi : SerialProtocol (chargée d'ajouter et d'interpréter des headers aux messages, entre autres). Cet objet SerialProtocol comporte son propre thread, utilisé par move :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    thread = new QThread;
    this->moveToThread(thread);
    thread->start();
    Un timer également porté par SerialProtocol déclenche la lecture du port série toutes les 50 ms.

    Chaque entité de l'application est obligée de passer par ce SerialProtocol pour utiliser le port série. Seulement plusieurs entités de l'application peuvent avoir besoin d'accéder au même port série, et généralement depuis des threads différents. Pour ce faire, chaque entité accède au port série via une instance de SerialInterfaceAccessor. Ce SerialInterfaceAccessor porte un membre QSharedPointer<SerialProtocol> qui est un pointeur partagé vers l'objet SerialProtocol.

    On a donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SerialInterfaceAccessor::QSharedPointer<SerialProtocol> -----------|
                                                                       V
    SerialInterfaceAccessor::QSharedPointer<SerialProtocol>  --------> SerialProtocol::QSharedPointer<QSerialPort>  ------->  QSerialPort
                                                                       ^
    SerialInterfaceAccessor::QSharedPointer<SerialProtocol>  ----------|
    Ma question concerne précisément QSharedPointer, donc la doc précise :

    Thread-Safety
    QSharedPointer and QWeakPointer are thread-safe and operate atomically on the pointer value. Different threads can also access the QSharedPointer or QWeakPointer pointing to the same object at the same time without need for locking mechanisms.
    It should be noted that, while the pointer value can be accessed in this manner, QSharedPointer and QWeakPointer provide no guarantee about the object being pointed to. Thread-safety and reentrancy rules for that object still apply.
    Ai-je bien compris, cela signifie-t-il que mon application peut fonctionner ainsi sans que j'ai à me soucier de placer des mutex au niveau de SerialProtocol ?

  2. #2
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 840
    Points : 5 545
    Points
    5 545
    Par défaut
    Bonjour,

    De mon point de vue, cela veut dire qu'avoir un même QSharedPointer auquel on accède en même temps sur différents threads ne nécessite pas de mutex (on parle ici de l'instance de QSharedPointer, pas de la ressource gardée par le QSharedPointer). Par exemple, si deux threads font un if (ptr.isNull()) en même temps, il n'y a pas besoin de mutexer. Cependant, ce qui est indiqué, c'est qu'il n'y a aucune garantie sur l'objet pointé. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // Thread 1 :
     
    if (!ptr.isNull())
    {
        ptr->doSomething();
    }
     
    // Thread 2 :
     
    if (!ptr.isNull())
    {
        ptr.clear();
    }
    Au moment du !isNull(), on recevra peut-être true, d'un côté et/ou de l'autre, sauf que si le thread 2 opère plus rapidement, à ce moment il aura libéré le pointeur et ptr->doSomething() donnera un crash vu que l'instance gardée ne sera plus valide. Il faut donc bien mutexer, de mon point de vue.

    Bonne journée,
    Louis

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

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. Réponses: 2
    Dernier message: 15/05/2004, 18h33
  3. Réponses: 16
    Dernier message: 30/01/2004, 11h05
  4. [VB6][active x] faire du multi-thread avec vb
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/05/2003, 12h01
  5. [Kylix] exception qtinft.dll et multi-threading
    Par leclaudio25 dans le forum EDI
    Réponses: 3
    Dernier message: 27/03/2003, 18h09

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