PPL での .then 構築の目的は何ですか? どこでテストできますか? Visual Studio 2012 はまだサポートしていないようです (将来の CTP の可能性がありますか?)。また、標準の C++11 非同期ライブラリに同等のものはありますか?
2 に答える
目的は、順番に実行する必要がある非同期タスクを表現できるようにすることです。
たとえば、GUI アプリケーションを使用しているとします。ユーザーがボタンを押すと、タスクを非同期的に開始してオンラインでファイルを取得し、それを処理して何らかのデータを取得し、このデータを使用して GUI を更新したいと考えています。これが発生している間、主に GUI の応答性を維持するために、他にも多くのタスクが進行中です。
これは、コールバックを呼び出すコールバックを使用して行うことができます。ラムダに関連付けられた .then() 機能を使用すると、インスタンス化する場所にすべてのコールバック コンテンツを書き込むことができます (必要に応じて、個別のコールバックを引き続き使用できます)。また、各個別のタスクの作業が同じスレッドによって行われることを保証するものではなく、最初のスレッドが既に行う作業が多すぎる場合に、空きスレッドがタスクを盗む可能性があります。
.then() 関数は C++11 には存在しませんが、std::future クラス (基本的にはタスクまたはタスクの結果へのハンドル) に追加することが提案されています。
クライムはすでに素晴らしい答えを出しましたが、具体的な例を挙げたいと思いました。
.then
.get
タスクに継続を付加し、基本的に同期と同等の非同期です。
C ++ 11にはstd::future
、と同等のがありconcurrency::task
ます。std::future
現在はしかありませんが.get
、追加する提案.then
(およびその他の優れたもの)があります。
std::async(calculate_answer(the_question_of_everything))
.then([](std::future<int> f){ std::cout << f.get() << "\n"; });
上記のスニペットは、非同期タスク(で起動)を作成し、前述のタスクが完了するとすぐに終了したタスクのをstd::async
渡す継続を添付します。std::future
これは実際にはそのstd::future
タスクに対して別のものを返し、現在のC ++ 11標準はそのデストラクタをブロックしますが、デストラクタのブロックを解除する別の提案があります。したがって、上記のコードを使用して、計算されるとすぐに回答を出力するファイアアンドフォーゲットタスクを作成します。
同等のブロッキングは次のようになります。
auto f = std::async(calculate_answer(the_question_of_everything));
std::cout << f.get() << "\n";
f.get()
このコードは、回答が利用可能になるまでブロックされます。