41

メンバー関数で 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);
}

非同期を合計するために呼び出したい。

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

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

4

2 に答える 2

48

このようなもの:

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

また

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

はインスタンスで、pはです。Personxxxint

この簡単なデモは、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";
}
于 2012-12-02T12:04:05.530 に答える
20

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

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 をラムダに移動することもできます。)

于 2012-12-02T12:05:26.733 に答える