誰がそれらのそれぞれをいつ使用するかについて高いレベルの直感を与えることができますか?
参照:
実際には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の非同期タスク:まだまだありません
私が見つけた簡単な理由の1つは、非同期ジョブが完了したかどうかを(ポーリングを介して)検出する方法が必要な場合です。 _std::thread
_を使用すると、自分で管理する必要があります。 _std::async
_を使用すると、std::future::valid()
を照会(またはstd::future::wait_for/wait_until(...)
を使用)して、いつ完了したかを知ることができます。