Class et std:: async sur un membre de classe en C++
J'essaie d'écrire un membre de classe qui appelle un autre membre de classe plusieurs fois en parallèle.
J'ai écrit un exemple simple du problème et je ne peux même pas compiler ceci. Qu'est-ce que je fais de mal à appeler std::async? Je suppose que le problème serait avec la façon dont je passe la fonction.
#include <vector>
#include <future>
using namespace std;
class A
{
int a,b;
public:
A(int i=1, int j=2){ a=i; b=j;}
std::pair<int,int> do_rand_stf(int x,int y)
{
std::pair<int,int> ret(x+a,y+b);
return ret;
}
void run()
{
std::vector<std::future<std::pair<int,int>>> 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<int,int> ttt=ran[i].get();
cout << ttt.first << ttt.second << endl;
}
}
};
int main()
{
A a;
a.run();
}
Compilation:
g++ -std=c++11 -pthread main.cpp
2 réponses
do_rand_stf
est une fonction membre non statique et ne peut donc pas être appelée sans une instance de classe (le paramètre this
implicite.) Heureusement, std::async
gère ses paramètres comme std::bind
, et bind
à son tour peut utiliser std::mem_fn
pour transformer un pointeur de fonction membre en un foncteur qui prend un paramètre this
explicite, donc tout ce que vous devez faire est de passer this
à l'invocation std::async
et d'utiliser la syntaxe du pointeur de fonction membre valide]}
auto hand=async(launch::async,&A::do_rand_stf,this,i,j);
Il y a d'autres problèmes dans le code. Tout d'abord, vous utilisez std::cout
et std::endl
, sans #include
ing <iostream>
. Plus sérieusement, std::future
n'est pas copiable, SEULEMENT mobile, donc vous ne pouvez pas push_back
l'objet nommé hand
sans utiliser std::move
. Sinon, il suffit de passer le résultat async
à push_back
directement:
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);
});