Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur avec les threads

Sujet résolu
    26 mai 2020 à 19:22:33

    Bonjour !

    J'essais d'apprendre à utiliser les thread en faisant tourner 2 algorithme de "trie" en parallèle (Juste à titre indicatif bien sur, c'est un exercice que je me donne). Mais bien que mes fonctions soit bien static etc et...(J'ai déjà regarder sur quelques forum). J'ai toujours cette erreur :

    std::tuple<std::vector<int,std::allocator<int>> (__cdecl *)(sf::RenderWindow &,std::vector<int,std::allocator<int>>),sf::RenderWindow,std::vector<int,std::allocator<int>>>::tuple' : aucune fonction surchargée ne nécessite 3 arguments


    Et j'ai beau la lire dans tout les sens je n'y comprend rien :/ Voici le code :

    Mon main :

    	std::thread trdBubble(BubbleSort::sortThread, rWindowBubble,tab);
    	std::thread trdQuick(QuickSort::sortThread, rWindowQuick, tab);
    
    	trdBubble.join();
    	trdQuick.join();
    

    Et les déclarations de fonctions en questions (Les fonctions fonctionnes seul, je les ais déjà testé) :

    	static std::vector<int> sortThread(sf::RenderWindow& rWindow, std::vector<int> tab);

    Il s'agit de la même forme pour les 2, Merci de votre aide !

    • Partager sur Facebook
    • Partager sur Twitter
      26 mai 2020 à 21:05:03

      Bonjour,

      Quand les paramètres du thread sont des références, il y a aussi une difficulté. Il faut lui rappeler que c'est par référence, par exemple :

      std::thread  trdBubble( &BubbleSort::sortThread,  std::ref(rWindowBubble), tab );
      

      Et on peut tout à fait passer à un thread une fonction membre non static, il y aurait juste un paramètre supplémentaire à utiliser. Si BubbleSort::sortThread n'était pas static, ça donnerait :

      std::thread  trdBubble( &BubbleSort::sortThread, &LObjetBubbleSort, std::ref(rWindowBubble), tab );
      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        27 mai 2020 à 13:11:26

        Merci ! C'est que c'est un peu compliqué les thread ^^'. Petite question technique au passage tant qu'à faire : Est-ce que les "threads" sont géré de manière autonome sur le hardware ? Dans le sens ou si j'ai plusieurs thread est ce qu'il seront bien répartit selon les cœurs et le GPU ou je dois me creuser la tête ?

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          27 mai 2020 à 14:15:46

          Salut,

          Quand tu codes un programme lambda, celui-ci s'exécutera a priori dans l'espace dit utilisateur de l'OS (sauf si tu codes le kernel d'un OS...). En fait, ton std::thread lance une requête, appelée appel système, au kernel de l'OS. C'est le scheduler ou ordonnanceur qui fait le travail de commutation (ce que tu appelles "gestion autonome sur le hardware"), et le scheduler est interne au kernel de l'OS. Donc tu ne peux pas y accéder. Heureusement !

          Quelques liens pour mieux comprendre comment ça fonctionne, et t'orienter vers des notions que tu pourras approfondir :

          https://fr.wikipedia.org/wiki/Ordonnancement_dans_les_syst%C3%A8mes_d%27exploitation

          https://fr.wikipedia.org/wiki/Espace_noyau

          https://fr.wikipedia.org/wiki/Espace_utilisateur

          https://fr.wikipedia.org/wiki/Appel_syst%C3%A8me

          Il faut bien comprendre que si tu as l'illusion que ton thread tourne tout seul sur un cœur, en fait un cœur (CPU) est constamment en train de changer de tâche, que ce soit un thread ou un processus. Ce changement, très rapide pour nous humain, nous donne cette impression que l'ordinateur fait plusieurs choses à la fois : lire une trame d'une vidéo, rafraichir l'écran, lire le son, etc. Or, un cœur ne peut exécuter qu'une seule chose à la fois. Tout ce qu'il fait est fait de façon séquentielle. Comme il parvient à tout faire, successivement, en l'espace de quelques millisecondes, à notre échelle c'est imperceptible.

          Je parle bien pour un seul cœur. Si le CPU entier contient plusieurs cœurs, ils peuvent effectivement, à un instant t, faire différentes choses. Chacun fonctionne par contre par commutation de tâche comme décrit précédemment.

          Enfin, un thread ou un processus ne s'exécute jamais sur GPU.

          -
          Edité par Anonyme 27 mai 2020 à 14:25:52

          • Partager sur Facebook
          • Partager sur Twitter
            27 mai 2020 à 15:07:41

            Merci encore ! Je me renseignerais pour savoir comment optimiser un programme, j'aimerais utiliser du GPU aussi ^^, bref mon problème étant résolu je remet à jour le Post

            • Partager sur Facebook
            • Partager sur Twitter

            Erreur avec les threads

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown