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 
23
demandé sur UldisK 2012-08-01 15:38:44

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 #includeing <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));
40
répondu JohannesD 2017-07-16 12:23:18

Vous pouvez passer le pointeur this à un nouveau thread:

async([this]()
{
    Function(this);
});
2
répondu Andrew 2017-06-01 02:48:50