web-dev-qa-db-fra.com

Comment utiliser std :: async sur une fonction membre?

Comment puis-je utiliser l'appel std :: async sur une fonction membre?

Exemple:

class Person{
public:
    void sum(int i){
        cout << i << endl;
    }
};

int main(int argc, char **argv) {
    Person person;
    async(&Person::sum,&person,4);
}

Je veux appeler pour résumer async.

Person p;
call async to p.sum(xxx)

Je n'ai pas compris si je pouvais le faire avec std :: async. Je ne veux pas utiliser boost. Vous recherchez un moyen d'appel asynchrone d'une ligne.

30
Avihai Marchiano

Quelque chose comme ça:

auto f = std::async(&Person::sum, &p, xxx);

ou

auto f = std::async(std::launch::async, &Person::sum, &p, xxx);

p est une instance de Person et xxx est une int.

Cette démonstration simple fonctionne avec GCC 4.6.3:

#include <future>
#include <iostream>

struct Foo
{
  Foo() : data(0) {}
  void sum(int i) { data +=i;}
  int data;
};

int main()
{
  Foo foo;
  auto f = std::async(&Foo::sum, &foo, 42);
  f.get();
  std::cout << foo.data << "\n";
}
28
juanchopanza

Il y a plusieurs façons, mais je trouve qu'il est plus clair d'utiliser un lambda, comme ceci:

int i=42;
Person p;
auto theasync=std::async([&p,i]{ return p.sum(i);});

Cela crée un std::future. Pour un exemple complet de ceci, j'ai un exemple complet comprenant une configuration asynchrone de mingw ici:

http://scrupulousabstractions.tumblr.com/post/36441490955/Eclipse-mingw-builds

Vous devez vous assurer que p est thread-safe et que la référence & p est valide jusqu'à ce que l'async soit jointe. (Vous pouvez également maintenir p avec un pointeur partagé, ou en c ++ 14, un unique_ptr ou même déplacer p dans le lambda.)

15
Johan Lundberg