Classes et multi thread sur méthodes non statiques

Bonjour,

Voici le code c++ :

public class A{
public:
A(int _champ1, int _champ2) : champ1(_champ1), champ2(_champ2) {}
void calcul(){Fait un calcul relativement long}
private:
int champ1, champ2;
}

int main(){
A a1 = new A(0, 0);
A a2 = new A(1, 1);
pthread p1;
pthread p2;
pthread_create(&p1, NULL, &a1->calcul(), NULL);
pthread_create(&p2, NULL, &a2->calcul(), NULL);

//Réccupération & Analyse des résultats de "calcul" qui ne pose pas de pb particulier
}

Vous l'aurez compris, je veux que a1->calcul() et a2->calcul() s'exécutent en parallèle. Je ne peux pas rendre la méthode calcul() statique car elle a besoin de paramètres propre à l'objet pour fonctionner.

Y aurait-il un moyen de faire ça ?

En l'état, je me fais insulter par le compilateur qui me dit que je n'ai pas le droit de mettre une méthode non statique dans mon thread.

Merci !

2 réponses

  1. Bonjour !

    Je me pointe là comme une fleur sans être certain de ce que je dis...
    Est-il possible de déclarer les attributs et les méthodes utilisés dans le main (A et calcul() pour les citer) comme étant des statiques ? La déclaration d'une méthode statique faisant appel à des attributs et méthodes statiques ne devrait pas être boulée par le compilateur

    Bonne journée

    Luc
    Les 3 plus grands mensonges du dev ? La doc sera faite plus tard... Le programme n'a aucun bug... Les spécifs sont finies...
    Un peuple sacrifiant sa liberté pour plus de sécurité perd les deux.
    0
    1. Non,
      On peut créer dans type locaux, qui pourront avoir des méthodes, ces méthodes doivent être inline et en aucun cas statiques ou virtuelles. De même les données membres des type locaux ne peuvent pas être statiques.
      0
  2. Bonjour,
    pthread_create() c'est du langage C, en C++ on préférera std::thread.
    Une méthode non statique a besoin d'une donnée supplémentaire pour se dérouler, c'est l'objet. Un thread c'est une fonction qui se déroule donc peut être une méthode statique.

    Ici, on pourrait faire :
    class A { 
    public: 
       A(int _champ1, int _champ2) : champ1(_champ1), champ2(_champ2) {} 
       void calcul() {Fait un calcul relativement long}
       static void* thread_it( void* z ) { ((A*)z)->calcul(); return 0; }  
    private: 
       int champ1, champ2; 
    }
    
    int main() { 
       A a1 = new A(0, 0) , a2 = new A(1, 1); 
       pthread p1 , p2; 
       pthread_create(&p1, NULL, &A::thread_it, a1 ); 
       pthread_create(&p2, NULL, &A::thread_it, a2 ); 
    }

    Sinon en C++11, on utiliserait plutôt
    std::thread( &A::calcul , a1 ).detach();
    qui a beaucoup plus de souplesse, surtout s'il y a des valeurs à retourner.
    0