Class et std :: async sur le membre de la classe en C ++

J’essaie d’écrire un membre de la classe qui appelle un autre membre de la classe plusieurs fois en parallèle.

J’ai écrit un exemple simple du problème et je ne peux même pas le comstackr. Qu’est-ce que je fais de mal en appelant std :: async? Je suppose que le problème serait avec la façon dont je passe la fonction.

#include  #include  using namespace std; class A { int a,b; public: A(int i=1, int j=2){ a=i; b=j;} std::pair do_rand_stf(int x,int y) { std::pair ret(x+a,y+b); return ret; } void run() { std::vector<std::future<std::pair>> ran; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { auto hand=async(launch::async,do_rand_stf,i,j); ran.push_back(hand); } } for(int i=0;i<ran.size();i++) { pair ttt=ran[i].get(); cout << ttt.first << ttt.second << endl; } } }; int main() { A a; a.run(); } 

compilation:

 g++ -std=c++11 -pthread main.cpp 

do_rand_stf est une fonction membre non statique et ne peut donc pas être appelée sans instance de classe (le paramètre implicite.) Heureusement, std::async gère ses parameters comme std::bind , et bind à son tour peut utiliser std::mem_fn pour Transformez un pointeur de fonction membre en un foncteur prenant explicitement this paramètre. Il vous suffit donc de le transmettre à l’invocation de std::async et d’utiliser la syntaxe de pointeur de fonction membre valide lors du passage de do_rand_stf :

 auto hand=async(launch::async,&A::do_rand_stf,this,i,j); 

Il y a cependant d’autres problèmes dans le code. Premièrement, vous utilisez std::cout et std::endl sans #include ing . Plus sérieusement, std::future n’est pas copiable, mais uniquement déplaçable, vous ne pouvez donc pas push_back la hand object nommé sans utiliser std::move . Sinon, il suffit de transmettre le résultat async directement à push_back :

 ran.push_back(async(launch::async,&A::do_rand_stf,this,i,j)); 

Vous pouvez passer le pointeur this à un nouveau thread:

 async([this]() { Function(this); });