web-dev-qa-db-ja.com

std :: asyncとstd :: threadsを使用する場合

41
Javi V

実際にはeither-orのことではありません-手動で作成されたstd :: threadsでfuture(promiseと一緒に)を使用できます。 std::asyncの使用は、非同期計算のためにスレッドを起動し、将来を介して結果をマーシャリングする便利な方法ですが、std::asyncは現在の標準ではかなり制限されています。マイクロソフトのPPLからのアイデアの一部を組み込むための提案された拡張機能が受け入れられると、より便利になります。

現在、std::asyncはおそらく、非常に長時間実行される計算またはかなり単純なプログラムの長時間実行IOのいずれかに最適です。ただし、オーバーヘッドが低いことは保証されていません(実際、その指定方法により、舞台裏でスレッドプールを実装することは困難になります)。したがって、きめの細かいワークロードにはあまり適していません。そのためには、std::threadを使用して独自のスレッドプールをロールするか、MicrosoftのPPLやIntelのTBBなどを使用する必要があります。

std::threadを使用して、より現代的で移植性の高い方法で記述された「従来の」POSIXスレッドスタイルコードを作成することもできます。

Bartosz Milewskiはstd::asyncが現在彼の記事で指定されている方法の制限のいくつかについて議論しています C++ 11の非同期タスク:まだまだありません

33
mattnewport

私が見つけた簡単な理由の1つは、非同期ジョブが完了したかどうかを(ポーリングを介して)検出する方法が必要な場合です。 _std::thread_を使用すると、自分で管理する必要があります。 _std::async_を使用すると、std::future::valid()を照会(またはstd::future::wait_for/wait_until(...)を使用)して、いつ完了したかを知ることができます。

5
Robert