2018年06月21日
《その408》コンストラクタによる taskオブジェクトの生成
下記のプログラムでは、まず、create_task関数で taskオブジェクトを作っています。
then関数により処理が継続し、t1 〜 t4 の順に実行されます。
auto t1 = create_task([] { cout << "aaaaaa\n"; });
auto t2 = t1.then([] { return "xxxxxx"; });
auto t3 = t2.then([](string str) { cout << 100 << '\n'; });
auto t4 = t3.then([] { return 888; });
コンストラクタによる taskオブジェクトの生成
クラステンプレート task<> を用いて、
返却値無しの taskオブジェクは、コンストラクタ task<void> により、
返却値が int型の taskオブジェクは、コンストラクタ task<int> により、
返却値が string型の taskオブジェクは、コンストラクタ task<string> により、
それぞれ生成することができます。
t4 の終了を待って t5, t6 の処理が行われますが、どちらが先に完了するかは決まっていません。
t4.wait();
auto t5 = task<void>([] { cout << "bbbbbb\n"; });
auto t6 = task<string>([] { return "yyyyyy"; });
t5 の終了を待って t7, t8 の処理が行われますが、どちらが先に完了するかは決まっていません。
t5.wait();
auto t7 = task<void>([] { cout << 200 << '\n'; });
auto t8 = task<int>([] { return 999; });
以上から、
画面出力をする task の実行は、t1, t3, t5, t7 の順に行われることになります。
最後に、t7 の終了を待って t2, t4, t6, t8 の返却値を表示します。
t7.wait();
cout << t2.get() << '\n';
cout << t4.get() << '\n';
cout << t6.get() << '\n';
cout << t8.get() << '\n';
以下はプログラムです。
#include <iostream>
#include <ppltasks.h>
#include <string>
using namespace concurrency;
using namespace std;
int main() {
// create_task関数で taskオブジェクトを作る例
auto t1 = create_task([] { cout << "aaaaaa\n"; });
auto t2 = t1.then([] { return "xxxxxx"; });
auto t3 = t2.then([](string str) { cout << 100 << '\n'; });
auto t4 = t3.then([] { return 888; });
// コンストラクタで taskオブジェクトを作る例
t4.wait();
auto t5 = task<void>([] { cout << "bbbbbb\n"; });
auto t6 = task<string>([] { return "yyyyyy"; });
t5.wait();
auto t7 = task<void>([] { cout << 200 << '\n'; });
auto t8 = task<int>([] { return 999; });
t7.wait();
cout << t2.get() << '\n';
cout << t4.get() << '\n';
cout << t6.get() << '\n';
cout << t8.get() << '\n';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7805270
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック