Partage
  • Partager sur Facebook
  • Partager sur Twitter

Discussion threads C++ moderne

    24 septembre 2021 à 22:50:21

    Salut !

    Soit la petite fonction non thread safe suivante :

    void NonSafe()
    {
      // des trucs hélas non thread safe
      Calcul1Safe();
      Calcul2Safe();
      Calcul3Safe();
      Calcul4Safe();
    }

    Chacune des fonctions Calcul est safe, calculatoire maaaaiiis "pas trop". 

    Je m'explique. Si je lance sans thread, ça me prend un temps T.

    Si je crée 4 threads dans la fonction NonSafe (chacun lance un calcul), tout le temps que je gagne a faire les calculs en parallèle, je le perd en création et destruction de thread, parce que c'est calculatoire mais pas assez...

    De plus, je lance plein de fois la fonction NonSafe (et je ne peux pas la paralléliser elle). Donc en tentant ce que j'ai dit, finalement, je passe mon temps à créer et détruire des threads....

    Je souhaiterais savoir s'il existe un mécanisme élégant qui me permettrait de créer 4 threads en amont, une fois pour toutes. Un "ThreadPool" que je passerais en paramètre à ma fonction NonSafe, et celle ci lancerait les threads déjà prêts à l'emploi pour le calcul, et beaucoup plus rapidement que la création / destruction.

    Ainsi, en tout et pour tout, même si j'appelle des milliers de fois ma fonction NonSafe, il n'y aurait que 4 création de threads au début. 


    Ainsi j'aurais une réelle accélération de mon programme. 

    Merci !

    -
    Edité par Fvirtman 24 septembre 2021 à 22:50:42

    • Partager sur Facebook
    • Partager sur Twitter

    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

      24 septembre 2021 à 23:06:46

      J'utilise que QtConcurrent et QThreadPool, donc je n'ai pas suivi les details du standard, mais a ma connaissance, pas de thread pool dans le standard.

      J'ai vu passé des trucs récents (CppCon ? Boost ? Je sais plus), mais ca ne doit pas être complexe à implémenter.

      • Partager sur Facebook
      • Partager sur Twitter

      Rejoignez le discord NaN pour discuter programmation.

        25 septembre 2021 à 3:31:37

        Salut,

        J'ai tendance à être à la masse, aujourd'hui.  Donc, il se peut que je sois encore une fois à coté :D

        A vrai dire, je verrais bien deux solutions "plausibles", en fonction de la situation.  L'idée de base étant quand même de créer un "thread pool", ce qui ne semble pas vraiment difficile (tiens, ne voici un tout fait: https://github.com/bshoshany/thread-pool ).

        Et, à partir de là, ben, en gros, on pourrait soit:

        • modifier la signature de ta fonction (si tant est qu'il soit possible de le faire) de manière à transmettre le thread pool en paramètre ou
        • initialiser un thread pool avec le nombre de thread qui t'intéressent comme variable statique de ta fonction

        Le choix entre les deux solutions s'effectuant en fonction de la réponse à la question "peut-on (est-il opportun de) changer la signature de ta fonction?"

        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
          27 septembre 2021 à 22:00:33

          Merci pour ces réponses.

          Koala, j'ai regardé le code, je m'attendais à quelque chose de plus light. Après, tant pis si je ne peux pas changer la signature de la fonction, je peux totalement me débrouiller avec.

          gbdivers, aurais tu un exemple simple avec QT ? Ou même juste quelques fonctions, et un petit peu de théorie qui va avec ?

          • Partager sur Facebook
          • Partager sur Twitter

          Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

            27 septembre 2021 à 22:13:07

            C'est un thread pool assez classique je pense (je n'ai pas regardé l'implementation), avec des fonctions pour lancer les taches. https://doc.qt.io/qt-6/qtconcurrent.html#run Et avec des futures pour gerer les taches.

            • Partager sur Facebook
            • Partager sur Twitter

            Rejoignez le discord NaN pour discuter programmation.

            Discussion threads C++ moderne

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown