2016-10-17 7 views
0

クラスでstd :: asyncオブジェクトを作成した場合、対応するスレッドはどれくらいの期間実行されますか?収容クラス(Bar)のデストラクタが呼び出されるまでは?std :: asyncの実行時間はどのくらいですか?

class Bar { 

public: 

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

... 

void Foo() { 
    while (true) {//do stuff//} 

} 

private: 
    std::future<void> handle; 

}; 

EDIT:

どのくらい次の例では、スレッドの実行ん:

class Bar { 

public: 

Bar() : thread(&Bar:foo, this) { 
} 

... 

void Foo() { 
    while (true) {//do stuff//} 

} 

private: 
    std::thread thread; 

}; 

答えて

2

は、非同期操作は、関数が戻るまで実行されます。無限ループの場合、永遠に実行されます。実際に、非同期操作を「中断する」安全な方法はありません。終了するようにスレッド通信を使用する必要があります。

関連する未来を破壊すると、操作が完了するまでブロックされます。

実装がスレッドプールを使用する場合は、操作をサポートするスレッドがそれを超えて実行される可能性がありますが、そのことについては心配する必要はありません。

+0

ありがとう、非常に洞察力がある。私は、私の例で関数Fooがstd :: asyncの代わりにstd :: threadsを使うべきであるというような定期的なタスク(クリーンアップのようなもの)を正しく理解していますか? – user695652

+0

C++標準によれば、コンパイラは無期限に実行されるスレッドを終了または最適化できることに注意してください。 – rubenvb