c++11 thread différence entre &A::fonction et &(A::fonction)
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

c++11 thread différence entre &A::fonction et &(A::fonction)



  1. #1
    docEmmettBrown

    c++11 thread différence entre &A::fonction et &(A::fonction)


    ------

    Bonjour,

    voila je me suis fait un petit thread et je bloque sur quelque chose que je ne comprend pas. Mon thread fonctionne tres bien quand je met :
    std::thread t1(&A::fonction, &a); et mon compilateur crie quand je met std::thread t1(&(A::fonction), &a); pourtant je donne bien à ma classe thread l'addresse de la méthode fonction dans les deux cas, alors ou est le probleme.
    je vous met mon code au besoin:
    Code:
    #include <thread>
    
    class A{
    	public:
    		A(){}
    		void fonction(){
                            //implémentation
    		}
    };
    
    
    int main(int argc, char const *argv[])
    {	
    	A a;
    	std::thread t1(&A::fonction, &a); //pourquoi &A::fonction marche et non &(A::fonction)
    	t1.join();
    
    	return 0;
    }
    Merci d'avance pour votre aide

    -----

  2. #2
    Chanur

    Re : c++11 thread différence entre &A::fonction et &(A::fonction)

    Et ça marche ???

    Je ne vois vraiment pas comment : ça voudrait dire que tu lances une méthode d'un objet sans avoir d'objet.

    Si tu veux lancer une méthode en thread, il faut :
    - soit que ce soit une méthode de classe (déclarée 'static')
    - soit que la classe de l'objet se charge elle-même de lancer la méthode : on fait ça en dérivant une classe Thread générique.

    D'ailleurs j'ai essayé ton programme. Résultat :
    Code:
    #0  0x00007f24cc9b13e5 in raise () from /lib/x86_64-linux-gnu/libc.so.6
    #1  0x00007f24cc9b4b4b in abort () from /lib/x86_64-linux-gnu/libc.so.6
    #2  0x00007f24ccfefd7d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #3  0x00007f24ccfedf26 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #4  0x00007f24ccfedf53 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #5  0x00007f24ccfee04e in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #6  0x00007f24ccf9aa3e in std::__throw_system_error(int) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #7  0x00007f24ccfa4cb7 in std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
    #8  0x0000000000400f42 in std::thread::thread<void (A::*)(), A*> (this=0x7fffe96de250, __f=@0x7fffe96de230) at /usr/include/c++/4.6/thread:135
    #9  0x0000000000400c3f in main (argc=1, argv=0x7fffe96de368) at thread.cpp:15
    Ce que tu as fait, c'est utiliser une syntaxe improbable dont le compilateur n'a pas compris qu'elle ne rimait à rien.
    C'est remarquable en soit, mais c'est quand même faux.
    Dernière modification par Chanur ; 22/05/2017 à 22h23.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  3. #3
    pm42

    Re : c++11 thread différence entre &A::fonction et &(A::fonction)

    Citation Envoyé par Chanur Voir le message
    Je ne vois vraiment pas comment : ça voudrait dire que tu lances une méthode d'un objet sans avoir d'objet.
    Si. C'est un des constructeurs de std::thread : il passe un pointeur de méthode de classe puis les arguments en varargs, le 1er étant l'objet sur lequel appliquer la dite méthode. Dans le cas présent, il a passé un pointeur vers une fonction sans argument de A puis un pointeur vers a, instance de A.

    Citation Envoyé par Chanur Voir le message
    D'ailleurs j'ai essayé ton programme. Résultat :
    Aucun problème ici.

    Sinon, la syntaxe indiquée marche avec &A::fonction parce que c'est la syntaxe pour un pointeur de méthode. En mettant les parenthèses, on se retrouve avec un pointeur de fonction classique et on ne peut pas l'appeler... Les joies de la syntaxe du C++...

  4. #4
    docEmmettBrown

    Re : c++11 thread différence entre &A::fonction et &(A::fonction)

    ok mais j'ai essayé de faire une fonction relai pour tester, mais ca ne marche pas, voici mon code
    Code:
    template<typename T>
    void relai(T *f, A *a){
    	a->*f();
    }
    
    int main(int argc, char const *argv[])
    {	
    	A a;
    	relai(&A::fonction, &a);
    
    	return 0;
    }
    Ce code n'a aucun interet mais il devrait marcher, ou est mon probleme?

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : c++11 thread différence entre &A::fonction et &(A::fonction)

    La classe A n'est pas définie.

    PS: autant pour moi, je n'avais pas vu qu'elle était définie plus haut.
    Dernière modification par Jack ; 23/05/2017 à 21h51.

  7. #6
    sandrecarpe

    Re : c++11 thread différence entre &A::fonction et &(A::fonction)

    Après bien du mal :

    Code:
    #include <iostream>
    
    
    class A
    {
            public:
                    A()
                    {
                    }
    
                    void fct()
                    {
                            std::cout << "relai" << std::endl;
                    }
    };
    
    
    template <typename T>
    void relai(void (T::*f)(), A* a)
    {
            (a->*f)();
    }
    
    
    int main()
    {
            A a;
            relai(&A::fct, &a);
            return 0;
    }

    Cependant, j'ai beau chercher je n'ai pas vu de façon d'utiliser le prototype que tu proposes pour la fonction relai
    Sinon, y a surement moyen de faire ça mieux avec std::function
    Dernière modification par sandrecarpe ; 23/05/2017 à 21h36.

  8. #7
    Chanur

    Re : c++11 thread différence entre &A::fonction et &(A::fonction)

    Je m'incline devant les explications de pm42 : ma connaissances du C++ étant beaucoup plus récente et moins approfondie que celle du C, il est certainement de meilleur conseil que moi.
    En particulier je n'ai jamais utilisé la classe std::thread.
    J'utilise, selon le contexte la classe QThread de Qt ou les fonctions pthread_create() etc. déclarées dans pthread.h
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

Discussions similaires

  1. Différence entre fonction f et fonction f tilde
    Par jules345 dans le forum Mathématiques du supérieur
    Réponses: 8
    Dernier message: 25/03/2022, 12h17
  2. la différence entre application et fonction
    Par amal20 dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 21/02/2018, 11h47
  3. la difference entre la fonction
    Par isabelle1203 dans le forum Chimie
    Réponses: 11
    Dernier message: 17/12/2012, 17h45
  4. Quelle différence entre un opérateur et une fonction ?
    Par anthony_unac dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 16/11/2012, 20h54
  5. différence entre famille et fonction=>?
    Par zaskzask dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 14/09/2012, 00h41