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 :

volatile & encapsulation


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut volatile & encapsulation
    Hello,

    Je viens de lire un intéressant article d'Andrei Alexandrescu, au sujet de l'utilisation du mot-clef volatile.

    Il propose l'utilisation d'une classe conteneur, un peu sur le principe des pointeurs intelligents.

    Je me demandais si cela avait déjà été mis en œuvre dans Boost, ou si je dois coder moi-même en fonction des propos d'Andrei.

    Merci.

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par oodini Voir le message
    Hello,

    Je viens de lire un intéressant article d'Andrei Alexandrescu, au sujet de l'utilisation du mot-clef volatile.

    Il propose l'utilisation d'une classe conteneur, un peu sur le principe des pointeurs intelligents.

    Je me demandais si cela avait déjà été mis en œuvre dans Boost, ou si je dois coder moi-même en fonction des propos d'Andrei.

    Merci.
    Si j'ai bonne memoire, cet article avait declanche un beau thread sur comp.lang.c++.moderated ou il avait fini par reconnaitre que volatile ne servait a rien d'autre en multithread qu'a masquer temporairement certaines erreurs sur certaines architectures.

    Voir aussi les documents preparatoires a C++0X qui discuttent quelque part de la semantique actuelle de volatile (a part pour les signaux et longjmp, rien de precis; historiquement concu pour traiter les IO mappees en memoire, de nos jours il faut au minimum une collaboration de l'OS pour que ca ait du sens, et encore certains compilateurs ne generent pas ce qu'il faut meme dans ce cas -- verifie pour Sparc) et d'une possible extension au multithread mais cette piste n'a pas ete suivie.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Si j'ai bonne memoire, cet article avait declanche un beau thread sur comp.lang.c++.moderated ou il avait fini par reconnaitre que volatile ne servait a rien d'autre en multithread qu'a masquer temporairement certaines erreurs sur certaines architectures.
    Il me semblait qu'il utilisait volatile simplement pour créer une type différent sur lequel une surcharge était possible, pas pour de supposées (mais fausses) vertus intrinsèques en terme de multithread, mais que n'importe quel autre décorateur de type peu employé aurait pu servir à la même chose. Ou alors je confond d'article ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Il me semblait qu'il utilisait volatile simplement pour créer une type différent sur lequel une surcharge était possible, pas pour de supposées (mais fausses) vertus intrinsèques en terme de multithread, mais que n'importe quel autre décorateur de type peu employé aurait pu servir à la même chose. Ou alors je confond d'article ?
    C'est peut-etre moi qui confond. Il y a bien eu aussi un article dans ce genre -- et c'est bien le style d'Andrei -- mais il me semble plus recemment (je n'ai guere fait plus que lire la date -- 2001). C'est pas impossible non plus qu'il y a eu une redecouverte de l'article plus recemment qui induise ma perception temporelle en erreur.

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Pour faire simple volatile (ici) est une instruction donnée au compilo pour lui dire: "Attention, cette variable pourra être modifiée par un autre "thread", si tu en stockes la valeur dans un registre n'oublie pas d'en rafraîchir le contenu depuis la mémoire avant chaque utilisation!".

    Nous ne parlons pas ici de synchronisation de "threads" mais de mise à jour entre ce qui est "dans" le CPU et ce qui est "dans" la mémoire.
    Indirectement, cela garantit la cohérence entre ce qui sera récupéré par deux threads accédant à la mémoire.

    Le modèle mémoire des architectures CPU de type CISC étaient cohérentes avec celui des langages de programmation à quelques exceptions près (dont celles ci). L'univers a changé, il y a plus d'une quinzaine d'année avec des architectures RISC dites multi-scalaires (et est instable depuis(*)).

    Pour essayer d'utiliser les capacités de calculs de ces bêtes, on pourra non seulement exécuter les instructions dans le désordre (out of order OOO) mais aussi optimiser les écritures du cache vers la mémoire (lazy write).
    => Finie la correspondance entre ce qu'on a écrit dans un langage haut niveau et ce qui sera exécuté par la machine!

    Impossible d'en rendre compte avec un modèle mémoire réduit aux entités { registres, mémoire }. De plus, s'il y a problème, c'est seulement pour les programmes multi-threads (ou le système d'exploitation).
    Point de salut en dehors de l'écriture ou de l'utilisation de primitives adaptées au processeur (et si possible portables) telle que POSIX threads ou TBB.

    (*) instable
    A la fin des années 90 (même pas une dizaine après leur adoption), monter en fréquence a posé d'énormes soucis côté OOO.
    Utiliser au mieux les capacités signifie que l'algorithme OOO est capable de jouer au bongo avec de plus en plus d'instructions en cours (allonger le pipeline).
    Ce qui impose un minimum de synchronisation incompatible avec la montée en fréquence: soit on a des bugs, soit on bride la bête!

    Et trois écoles on vu le jour:
    - Itanium : l'intelligence est complètement dans le compilo, le processeur déroule le ruban d'instruction qu'on lui soumet,
    - Power6 : cadencé vite mais sans OOO
    - Sparc (repris depuis par AMD et Intel) : sacrifions la capacité brute mais utilisons la densité pour multiplier le nombre de cœurs.
    Note: Au delà les querelles techniques et du récent habillage "green IT" des multi-coeurs, Sun et IBM ont d'abord décidé d'utiliser les budgets transistor pour répondre aux besoins de leurs clients (base installée).
    Ce qui est somme toute raisonnable.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Ce n'est pas que cela ne soit pas intéressant, mais c'est HS p/r à la question de l'OP où volatile est utilisé comme indicateur sur les fonctions (et non des données) pour faire de la vérification statique de code.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pour faire simple volatile (ici) est une instruction donnée au compilo pour lui dire: "Attention, cette variable pourra être modifiée par un autre "thread", si tu en stockes la valeur dans un registre n'oublie pas d'en rafraîchir le contenu depuis la mémoire avant chaque utilisation!".
    Sauf que comme ça fait pas de memory barriers ça marche qu'en mono-cœur...

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    Ce n'est pas que cela ne soit pas intéressant, mais c'est HS p/r à la question de l'OP où volatile est utilisé comme indicateur sur les fonctions (et non des données) pour faire de la vérification statique de code.
    J'ai relu l'article mentionné mais il ne semble pas aller aussi loin que vous le proposez.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut vaste sujet!
    Lire: Thread Cannot be Implemented as a Library

    Sur Linux, boost implemente les threads au dessus la de la librarie POSIX. Les sections critiques sont déclarées via des primitives telles que pthread_mutex_lock() qui incluent des primitives hardwares (memory barrier) interdisant les optimisations d'accès mémoires pouvant induire des problèmes de synchronisation.

    Si la manipulation des variables globales (partagées par plusieurs threads) sont encapsulées par ces primitives, "volatile" est, à priori, inutile.

    voir aussi: A Memory model for C++: FAQ qui explique pourquoi "volatile" est insuffisant.

    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Et si on utilise les mutex de boost, je suppose donc qu'on peut également se passer de volatile ?

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par oodini Voir le message
    Et si on utilise les mutex de boost, je suppose donc qu'on peut également se passer de volatile ?
    volatile n'est jamais necessaire en multithread -- il masque simplement parfois des problemes qui peuvent resurgir dans d'autres configurations.

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Je vois déjà quelques petits morceaux de HS.
    Dans l'article, volatile n'était pas utilisé pour ses propriétés rêvées ou propriétaires, mais pour tagguer des fonctions et dire: "cette fonction n'est pas thread-safe et ne sera accédée que depuis un seul thread à la fois", et "cette fonctions est thread-safe". En gros, c'est un pas vers de la vérification statique de code.

    Que cela marche ou pas, je n'ai pas assez creusé les échanges sur clc++m pour le dire.

    Dans le même ordre idée, voir l'article récent de Scott Meyers sur artima, où il va bien plus loin dans l'idée. Sa démonstration est intéressante, mais malheureusement inapplicable.


    Pour repartir dans l'HS, il semblerait qu'avec des moutures récentes de VC, volatile puisse être utilisé pour mettre en œuvre des singletons pouvant être construits paresseusement depuis un contexte multi-threadé -- là où le double lock-pattern (à base de mutex) a échoué.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  2. Que veut dire "volatile" devant une variable ?
    Par altahir007 dans le forum C
    Réponses: 4
    Dernier message: 23/06/2004, 15h47
  3. Encapsulation graphique d'un outil en ligne de commande
    Par Leishmaniose dans le forum Composants VCL
    Réponses: 3
    Dernier message: 12/11/2003, 11h59
  4. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58

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