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

Threads & Processus C++ Discussion :

Le C++ est-il adapté pour le multithreading et la programation parallèle ?


Sujet :

Threads & Processus C++

  1. #1
    Alp
    Alp est déconnecté
    Expert éminent sénior

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut Le C++ est-il adapté pour le multithreading et la programation parallèle ?
    Bonsoir,

    Selon vous, C++ fait-il partie des langages les plus adaptés pour le multithreading et la programmation parallèle, sujet au coeur de la recherche et des évolutions aujourd'hui ? Quels sont les meilleurs outils pour en tirer au mieux parti ?

    N'hésitez pas à argumenter, bien au contraire

    PS : voici quelques discussions qui se rapportent au développement parallèle en C++
    http://www.developpez.net/forums/d74...rallel-studio/
    http://www.developpez.net/forums/d74...-parallelisme/

  2. #2
    Membre actif
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Points : 213
    Points
    213
    Par défaut
    J'ai jamais poussé très loin mes utilisations des fils, mais je suis tombé sur ceci. Tout porte à croire que le C++ est effectivement adapté à cette utilisation si le comité décide d'ajouter ces outils à la STL.

    Après, il faudra voir le résultat.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Beaucoup de frameworks existent pour le C++ permettant la programmation parallèle. Ils sont tous plus ou moins efficaces :
    - OpenMP
    - MPI
    - TBB
    - wxWidgets
    - Qt
    - ...

    Bref, très efficace. Et avec les fonctions lambda, ça va encore aller en s'améliorant.

  4. #4
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Déjà, j'aimerais distinguer 3 types de multithreading :
    - Pour les performances (exploiter un matériel multi-cœurs)
    - Pour la réactivité (une IHM qui reste réactive quand le calcul s'éxécute, un programme gérant en temps réel des évènements extérieurs)
    - Pour l'isolation (un serveur web isolant les différentes réponses à différentes requêtes)

    Je pense que la question était particulièrement orientée vers le parallélisme pour la performance, qui est en effet d'actualité de nos jours.

    Pour la question, aujourd'hui, je dirais non car :
    - Le comportement multithread du C++ est platform dependant
    - Il n'y a rien de standard pour gérer les threads, les locks...
    - Il n'y a rien qui permette de remonter une exception depuis un thread vers le thread l'ayant lancé
    - La notion de fonction pure qui permettrait d'aider une parallélisation automatique n'existe pas
    - La syntaxe pour désigner une action est lourde (pas de lambda-expression)
    - C'est un langage impératif, qui plus est où la possibilité d'aliasing est omniprésente, rendant la parallélisation difficile.

    L'avantage, c'est qu'à part le dernier point, tous sont adressés par C++0x

    Et comme d'un autre côté, le C++ est un langage qui est orienté performances, il me semble naturel que que faire de la performance grâce au parallélisme se base déjà sur le fait de faire de la performance tout court.

    Autre point positif, le C++ est un langage où tout est fait pour permettre de bâtir des niveaux d'abstraction élevés à partir de couches bas niveau, sans que cette abstraction ait un coût trop important. Threads et lock sont des primitives bas niveau. Des bibliothèques comme TBB sont d'un niveau un peu plus élevé. Tout un niveau où le parallélisme devient non plus explicite mais implicite reste à construire.
    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.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Et comme d'un autre côté, le C++ est un langage qui est orienté performances, il me semble naturel que que faire de la performance grâce au parallélisme se base déjà sur le fait de faire de la performance tout court.
    Certains diront qu'il manque à ce niveau la possibilité de supprimer l'aliasing de pointeurs

  6. #6
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    - La notion de fonction pure qui permettrait d'aider une parallélisation automatique n'existe pas.
    [...]
    - C'est un langage impératif...

    L'avantage, c'est qu'à part le dernier point, tous sont adressés par C++0x
    Des fonctions pures ?
    Je ne me souviens pas avoir vu passer de proposition pour ça et la recherche du mot "pure" dans le draft de mars ne donne rien (sauf des références aux fonctions virtuelles pures)
    Est-ce une exclu pour developpez ?
    Aurais-tu quelques détails ?

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Des fonctions pures ?
    Je ne me souviens pas avoir vu passer de proposition pour ça et la recherche du mot "pure" dans le draft de mars ne donne rien (sauf des références aux fonctions virtuelles pures)
    En fait, j'ai été un peu trop enthousiaste...
    L'idée n'est pas forcément d'avoir une gestion par le standard de fonctions pures, mais de permettre à des compilateurs de gérer la notion de fonction pure. Mais cette idée fait débat.

    En gros, il y a une proposition sur les attributs, et parmi les exemples d'attributs, l'un des plus cités est un attribut pure pour les fonctions. Mais les attributs seraient en grande partie non standards, juste des points d'expansion pour les compilateurs. http://www.open-std.org/jtc1/sc22/wg...2008/n2553.pdf
    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.

  8. #8
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Sinon, en quoi les lambdas vont dans le sens de la programmation parallèle? (dans ma tête le mécanisme mis en oeuvre part le compilo revient à créer un foncteur)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On a souvent besoin de ce genre de fonctions/foncteurs/... pour le parallélisme. Ca permet donc de réduire le nombre de lignes à écrire. Ou de ne pas les appeler en-dehors d'un framework.

  10. #10
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    On y gagne en nombre de lignes à écrire, mais aussi en localité du code, et en besoin de trouver un nom.

    Si j'ai une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void f()
    {
      vector<double> v;
      // ... 
      for(auto it = v.begin() ; it != v.end() ; ++it)
      {
        *it = 2*g(*it);
      }
      // ...
    }
    Et que je désire remplacer le for par un parallel_for, avec un simple foncteur, je dois écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    struct ApplyGAndDoubleResult // nom pas forcément bien choisi, de plus, on ne sait pas trop où cette classe va servir
    {
      double operator()(double d)
      {
        return 2*g(d);
      }
    }; // Pas mal de lignes de code
     
    void f()
    {
      vector<double> v;
      // ... 
      // On est obligé d'aller regarder ailleur pour voir ce qui se passe dans la boucle
      parallel_for(v.begin(), v.end(), ApplyGAndDoubleResult ());
      // ...
    }
    Avec des lambdas, on se retrouve bien plus proche du code initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void f()
    {
      vector<double> v;
      // ... 
      parallel_for(v.begin(), v.end(), [](double d)
      {
          return 2*g(d);
      });
      // ...
    }
    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.

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Ahhh d'accord, je pensais que les lambdas permettrait des optimisations derrière pour du MT. Mais en fait non c'est par rapport à la compréhension du code. C'est le sens que j'avais pas compris.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    - Il n'y a rien qui permette de remonter une exception depuis un thread vers le thread l'ayant lancé
    Je ne comprends pas le fonctionnement / usage. Chaque thread ayant sa propre pile, et les exceptions remontant cette pile, comment ça marche / s'utilise ?

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Je ne comprends pas le fonctionnement / usage. Chaque thread ayant sa propre pile, et les exceptions remontant cette pile, comment ça marche / s'utilise ?
    Un exemple d'utilisation basé sur la notion de "future" où on lance un calcul en parallèle en gardant un objet qui représente le résultat, quand on essaie d'avoir la valeur du résultat, on bloque en attendant le résultat du calcul. Si le calcul échoue à cause d'une exception, il est sensé de jeter à nouveau cette exception quand on cherche à obtenir la valeur. Il est d'autres cas où on peut vouloir copier une exception d'une thread à l'autre.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  14. #14
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Merci pour l'explication.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Merci pour l'explication.
    Pour info, les QtConcurrent l'implémente
    http://doc.qtsoftware.com/4.6-snapsh...exception.html

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par yan Voir le message
    Pour info, les QtConcurrent l'implémente
    http://doc.qtsoftware.com/4.6-snapsh...exception.html
    A condition de la classe d'exception hérite d'une classe de Qt.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    La question initiale mériterait d'être reprise à la lumière des apports du C++11, non ? (même si les fonctionnalités concernant les threads sont encore celles qui sont le moins implémentées dans les grands compilateurs, mais, ma foi, ça ne saurait tarder maintenant...).

    A noter un livre excellent sur le sujet :

    C++, Concurrency in Action, par Antony Williams

Discussions similaires

  1. Le langage Java est-il adapté pour les jeux vidéo ?
    Par Invité dans le forum Développement 2D, 3D et Jeux
    Réponses: 637
    Dernier message: 05/02/2021, 22h38
  2. Réponses: 39
    Dernier message: 13/07/2018, 04h48
  3. Réponses: 1
    Dernier message: 27/04/2009, 10h28
  4. Réponses: 44
    Dernier message: 21/01/2009, 10h34
  5. [Joomla!] un CMS est-il adapté pour mon site?
    Par welcominh dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/04/2008, 22h33

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