Classe et std::async sur le membre de classe en C++
Je vais essayer d'écrire un membre de la classe qui en appelle un autre membre de la classe plusieurs fois en parallèle.
J'ai écrit un exemple simple du problème et ne peut même pas arriver à le compiler. Ce que je fais mal avec l'appel de std::asynchrone? Je crois que le problème serait avec la façon dont je suis passant à 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
- Passer
*this
comme troisième paramètre deasync
. - Si vous obtenez des erreurs lors de la compilation ou de la liaison, il serait une bonne idée d'inclure ces erreurs dans la question, de préférence verbatim.
- Vous n'avez pas besoin d'utiliser pthread plus avec C++11 🙂 c'est est l'un des plus grand plus dans C++11 ( threading ). async() est implicite thread si asynchrone lancement et explicite le filetage est également là dans le langage lui-même.
Vous devez vous connecter pour publier un commentaire.
do_rand_stf
est un non-fonction membre statique et ne peut donc pas être appelé sans une instance de classe (l'implicitethis
paramètre.) Heureusement,std::async
gère ses paramètres commestd::bind
, etbind
peut utiliserstd::mem_fn
à son tour un membre de pointeur de fonction en un foncteur qui prend explicitementthis
paramètre, donc tout ce que vous devez faire est de passerthis
à lastd::async
l'invocation et de l'utilisation de membre valide de pointeur de fonction syntaxe lors du passage de lado_rand_stf
:Il y a d'autres problèmes dans le code. Tout d'abord, vous utilisez
std::cout
etstd::endl
sans#include
ing<iostream>
. Plus sérieusement,std::future
n'est pas copiable, seuls mobiles, de sorte que vous ne pouvez paspush_back
l'objet nomméhand
sans l'aide destd::move
. Sinon, il suffit de passer leasync
résultat àpush_back
directement:std::async
utilisestd::bind
en interne? Parce que je ne peux pas en trouver.std::bind
, directement, mais fait la même chose. Depuis C++17 les deux sont définis en termes destd::invoke
. Avant cela, ils ont été définis dans les termes de la non-réifiée INVOQUER expression. J'ai édité le phrasé un peu.emplace_back
avecstd::move
Vous pouvez passer à la
this
pointeur vers un nouveau thread:this
etthat
différents? Le filetage intérieur duthis
est le même comme le filetage extérieur duthis
, sauf pour les il devrait y avoir pas de filetagethis
à tous, sauf capturé? Sonne plus comme javascript truc...this_thread::get_id()
est une façon de voir l'id de thread différence, pasthis
. Laquelle ne sera pas disponible en lambda si vous n'avez pas saisie à tous. Comme ici — ideone.com/uWNs4p — vous avez besoin pour capturerthis
explicitement. Et si vous le faites, ce n'est pas différent à l'extérieur de la lambda — ideone.com/YuPKf9that
serait de passer à autre objet à l'aide de la variable nom.