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

Boost C++ Discussion :

Différence boost.signals / boost.signals2, safe-thread ?


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut Différence boost.signals / boost.signals2, safe-thread ?
    Bonjour.

    La dernière version de boost propose une nouvelles bibliothèque pour gérer les signaux / slots. La seul grosse différence semble être que la nouvelle est safe-thread. Je ne comprend pas trop ce qu'il faut comprendre par safe-thread ? Pour un exemple concret, imaginons que j'ai une classe qui contient un signals, et 2 threads qui utilise une référence sur une même instance de cette classe. Avec la première version de signal pour l'utilisé il fallait vérouiller un mutex à chaque fois qu'un des thread allait utilisé le signal de la classe, est ce qu'avec la version 2 on peut utilisé le signal de la classe sans vérouiller de mutex ou est ce que la signification est autre ?

    Merci d'avance.

    PS : signals2 est header only, alros que signal1 devait être linker, ca a un impact sur les vitesses / performances de compilation / execution ?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Flob90 Voir le message
    Bonjour.

    La dernière version de boost propose une nouvelles bibliothèque pour gérer les signaux / slots. La seul grosse différence semble être que la nouvelle est safe-thread. Je ne comprend pas trop ce qu'il faut comprendre par safe-thread ? Pour un exemple concret, imaginons que j'ai une classe qui contient un signals, et 2 threads qui utilise une référence sur une même instance de cette classe. Avec la première version de signal pour l'utilisé il fallait vérouiller un mutex à chaque fois qu'un des thread allait utilisé le signal de la classe, est ce qu'avec la version 2 on peut utilisé le signal de la classe sans vérouiller de mutex ou est ce que la signification est autre ?

    Merci d'avance.
    Cela signifie surtout que la gestion mutli-thread elle-même est plus naturelle et naturellement safe.

    En effet, tu pouvais avoir, dans la première version, certaines surprises si tu l'utilisais en environnement multi-threadé, par exemple, si deux threads séparés tentaient d'enregistrer un slot ou un signal identique au même moment.

    Signals2 permet d'assurer la sécurité à ce genre de niveau, de manière transparente pour l'utilisateur (sans nécessiter le recours à "autre chose") et de manière plus naturelle
    PS : signals2 est header only, alros que signal1 devait être linker, ca a un impact sur les vitesses / performances de compilation / execution ?
    Beaucoup de bibliothèques de boost devaient à la base être compilées sous la forme de dll's (je pense, entre autres, à filesystem et à d'autres )

    Depuis, il me semble, la version 1.38, l'accent a été mis sur le fait de permettre un usage "headers only" de l'ensemble des bibliothèques.

    L'avantage principal que l'on en retire est, tout simplement, de ne pas rajouter une dépendance vis à vis de la dll correspondante (qui implique l'ajout d'option de configuration et de liaison et la nécessité de fournir la dll en question afin de s'assurer de sa présence sur le système d'installation)

    Un deuxième avantage, moins important, il faut bien l'avouer, tient dans le fait que la compilation "directe" est souvent de nature à ne laisser le code exécutable que des parties utiles et nécessaires à ton projet (du moins est-ce le cas pour toutes les bibliothèques basées sur des templates).

    L'inconvénient majeur que l'on peut trouver à cet état de fait est qu'effectivement, cela peut allonger quelque peu le temps de compilation (du simple fait qu'il faut... générer le code exécutable qui tenait à l'époque dans la dll et qui n'était généré qu'une fois lors de l'installation de boost).

    C'est la raison pour laquelle il reste toujours possible de créer les dll's des diffférentes bibliothèques de boost, et de les utiliser à l'instar de ce qui se faisait avant

    Finalement, maintenant tu as simplement le choix entre utiliser la dll (à lier correctement avec ton application) en évitant le temps de compilation du code exécutable correspondant ou éviter d'utiliser la dll (et donc de complexifier les règles de compilation de ton projet) en... perdant un peu de temps lors de la compilation (mais en n'ayant que les parties réellement utiles et nécessaires de la bibliothèque correspondante dans ton projet)
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En gros, ici thread-safe veut dire :

    Imagine que tu as une classe qui récupère des données sur le réseau. Disons que cette classe est instanciée dans un thread T1. Hop, elle a un message. Elle déclenche alors le signal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    jai_recu_un_message(const std::string&)
    Ce signal est connecté à un "slot" d'un widget de ton interface graphique qui affiche tel quel le message reçu. Disons qu'il s'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    affiche(const std::string&);
    Evidemment, ton interface graphique est instanciée et gérée dans un thread T2 séparé de T1.

    Avec boost.signals premier du nom, ce scénario n'était pas possible. Tu ne peux pas connecter un signal de quelque chose qui est dans un thread T1 avec un slot de quelque chose qui est dans un thread T2. Avec boost.signals2, c'est possible car les mécanismes de connexion et de déclenchement gèrent le fait que les différentes choses peuvent se situer dans des threads différents. C'est ça, être thread-safe.

  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 Alp Voir le message
    Avec boost.signals premier du nom, ce scénario n'était pas possible. Tu ne peux pas connecter un signal de quelque chose qui est dans un thread T1 avec un slot de quelque chose qui est dans un thread T2. Avec boost.signals2, c'est possible car les mécanismes de connexion et de déclenchement gèrent le fait que les différentes choses peuvent se situer dans des threads différents. C'est ça, être thread-safe.


    pour que ton slot soit exécuté dans le bon thread, il te faut un truc comme une eventloop et des relations entre un slot et un thread. Sinon je voie pas comment c'est possible. C'est ce que Qt propose.

    Boost::signal2 est thread-safe dans sa manipulation (ajout/retrait de slot) mais l'appel entre le signal/slot est un appel directe. Dans ton exemple le slot de ta widget est exécuté dans la thread de l'émetteur et non celui de ta widget.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    +1 avec le dernier post

Discussions similaires

  1. Lier les signal/slot de Qt à boost::signal
    Par Davidbrcz dans le forum Qt
    Réponses: 7
    Dernier message: 25/04/2008, 11h50
  2. Boost signal thread safe?
    Par epsilon68 dans le forum Boost
    Réponses: 13
    Dernier message: 04/02/2008, 17h20
  3. [BOOST] Mettre en pause un thread
    Par Groove dans le forum Boost
    Réponses: 3
    Dernier message: 24/02/2007, 11h34

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