2016-10-13 14 views
1

私はC++ 11の新機能であるstd::asyncを新しく導入しました。なぜ以下のコードが決して印刷されないのかわかりません。barコンストラクタでstd :: asyncを使用する

誰かが私のためにこれにいくつかの光を当てることができますか?このページ

class Thready { 

    public: 

    Thready() { 
     std::async(std::launch::async, &Thready::foo, this); 
    } 

    void foo() { 
     while (true) { 
      std::cout << "foo" << std::endl; 
     } 
    } 

    void bar() { 
     while (true) { 
      std::cout << "bar" << std::endl; 
     } 
    } 
}; 

int main() { 
    Thready t; 
    t.bar(); 
} 

答えて

2

詳細については、「注意」セクション:http://en.cppreference.com/w/cpp/thread/async

実装は、追加で(実装定義)ビットを有効にすることによって のstd ::非同期の最初の過負荷の動作を拡張することができます デフォルトの起動ポリシー。実装によって定義された起動 のポリシーの例は、同期ポリシー(非同期 呼び出し内で即時実行)とタスクポリシー(非同期ですが、スレッドローカルでは がクリアされていません)です。std :: future from std: :非同期基準に から移動または結合していない、のstd ::将来のデストラクタは、次の同期非同期動作まで完全表現の末尾に 完了、本質的にコードを作成する をブロックします:

(destr std :: uctors先物::ブロック決して非同期はstdするための呼び出し以外の手段によって得られた )

TL; DR:一部にはstd ::非同期呼び出しの戻り値を保存するために

試してみます変数:

auto handle = std::async(std::launch::async, &Thready::foo, this); 

EDIT:あなたが期待するよう

次のコードは動作するはずです。

#include <future> 
#include <iostream> 

class Thready { 

    public: 

    Thready() { 
     handle = std::async(std::launch::async, &Thready::foo, this); 
    } 

    void foo() { 
     while (true) { 
      std::cout << "foo" << std::endl; 
     } 
    } 

    void bar() { 
     while (true) { 
      std::cout << "bar" << std::endl; 
     } 
    } 

    std::future<void> handle; 
}; 

int main() { 
    Thready t; 
    t.bar(); 
} 
+0

大変です。 fooが無効になるようにすることは可能でしょうか? – user695652

+0

はい、編集を参照してください。どうやら、このケースのためのテンプレート特殊化、 'std :: future 'があります。 'void get()'メソッドもあります!私はそれを一度も使用しませんでした。 –

関連する問題