Classes et multi thread sur méthodes non statiques

Fermé
jktln - 25 févr. 2017 à 10:43
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 25 févr. 2017 à 11:43
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

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
25 févr. 2017 à 11:29
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
luckydu43 Messages postés 3484 Date d'inscription vendredi 9 janvier 2015 Statut Membre Dernière intervention 30 juin 2022 815
Modifié par luckydu43 le 25/02/2017 à 11:33
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
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
25 févr. 2017 à 11:43
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