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); });