2012-12-02 28 views
18

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

私は非同期を合計する呼びたいです。

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

私はstd :: asyncでそれを行うことができますか? ブーストを使用したくありません。 1行の非同期呼び出し方法を探しています。このような

+0

[メンバー関数によるスレッド開始](http://stackoverflow.com)/question/10673585/start-thread-with-member-function) –

答えて

17

何か:

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

又は

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

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

#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"; 
} 
+1

'std :: async(&Person :: sum、&p、xxx)' – inf

+1

はメンバ関数では必須ですが、フリー関数ではオプションです。 –

+0

私は試しましたがエラーが発生しました - 無効な引数 ' 候補者は std :: __ async_sfinae_helper :: type、#0、#1 ...> :: type async(#0 &&、#1 && ...) std :: future :: type> async(enum std :: launch、#0 &&、#1 && ...) ' –

13

あり、いくつかの方法がありますが、私はそれがこのように、ラムダを使用することが最も明らかです見つける:

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

これは、作成し

この簡単なデモでは、GCC 4.6.3で動作しますstd::future。これの完全な例については、私はここにmingwのの非同期対応のセットアップを含む完全な例があります。

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

あなたは、pは、スレッドセーフであることと& P参照がされるまで有効であることを確認する必要がありますasyncが結合されます。 (共有ポインタでpを保持することもできますし、C++ 14、unique_ptrを使うことも、ラムダにpを移動することもできます)。

+0

私は試しましたが、エラーがありました - 無効な引数 '候補:: std :: __ async_sfinae_helper :: type、#0、#1 ...> :: type async(#0 &&、#1 && .. )std :: future :: type> async(enum std :: launch、#0 &&、#1 && ...) ' –

+1

このエラーは実際のエラーではなく、ちょうど混乱している約C++ 11。ちょうどそれをコンパイルしてください! –

+0

うん、私はこれが日食の問題であることを理解する。 juanchopanza答えに私のコメントを参照してください。私のコードのいくつかはC++ 11であり、Eclipseのdosntには問題があります。私は非同期の問題がなぜあるのか理解していませんでした。このように非同期作業 - en.cppreference.com/w/cpp/thread/async –

関連する問題