メンバー関数で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行の非同期呼び出し方法を探しています。
このようなもの:
auto f = std::async(&Person::sum, &p, xxx);
または
auto f = std::async(std::launch::async, &Person::sum, &p, xxx);
ここで、p
はPerson
インスタンスであり、xxx
はint
です。
この簡単なデモは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";
}
いくつかの方法がありますが、次のようにラムダを使用することが最も明確です。
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をラムダに移動したりすることもできます。)