Classes et multi thread sur méthodes non statiques
jktln
-
Dalfab Messages postés 638 Date d'inscription Statut Membre Dernière intervention -
Dalfab Messages postés 638 Date d'inscription Statut Membre Dernière intervention -
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 !
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
-
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ôtstd::thread( &A::calcul , a1 ).detach();
qui a beaucoup plus de souplesse, surtout s'il y a des valeurs à retourner. -
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.