web-dev-qa-db-ja.com

メンバー関数でstd :: asyncを使用する方法

メンバー関数でstd :: async呼び出しを操作するにはどうすればよいですか?

例:

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

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

Sum asyncを呼び出します。

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

Std :: asyncでそれができるかどうかわかりませんでした。ブーストを使用したくない。 1行の非同期呼び出し方法を探しています。

30

このようなもの:

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

または

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

ここで、pPersonインスタンスであり、xxxintです。

この簡単なデモは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

いくつかの方法がありますが、次のようにラムダを使用することが最も明確です。

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

これにより、std::futureが作成されます。これの完全な例として、非同期のmingwの設定を含む完全な例をここに示します。

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

Pがスレッドセーフであり、&p参照が非同期に参加するまで有効であることを確認する必要があります。 (共有ポインターでpを保持したり、c ++ 14ではunique_ptrを保持したり、pをラムダに移動したりすることもできます。)

15
Johan Lundberg