2018年06月18日
《その406》create_task関数
create_task関数
create_task関数は、PPL_taskオブジェクトを作成します(PPL : Parallel Patterns Library)。
そして、この非同期処理の完了時に、task::then関数を用いて継続処理を行わせることができます。
プログラムでは、
auto task_start = create_task( ・・・・・・ );
として、最初の task を 定義しています。
次いで、
auto task_continuation_1 = task_start.then( ・・・・・・ );
auto task_continuation_2 = auto task_continuation_1.then( ・・・・・・ );
のようにして、task_start, task_continuation_1, task_continuation_2 を実行しています。
各task は連続実行されますが、それぞれの task の終了を、wait関数を用いて、
task_start.wait();
task_continuation_1.wait();
task_continuation_2.wait();
とすることにより、別個につかむこともできます。
以下はプログラムです。
#include <ppltasks.h>
#include <iostream>
using namespace concurrency;
using namespace std;
int main()
{
double a = 0;
double d = 0.000001;
int m = 30000;
int n = 40000;
cout << "・・・・・・作業開始(task_start)\n";
auto task_start = create_task([&a, d, m, n]
{
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
a += d;
cout << "・・・・・・task_start 完了\n";
});
auto task_continuation_1 = task_start.then([&a, d, m, n]
{
cout << "・・・・・・作業継続(task_continuation_1)\n";
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
a += d;
cout << "・・・・・・task_continuation_1 完了\n";
});
auto task_continuation_2 = task_continuation_1.then([&a, d, m, n]
{
cout << "・・・・・・作業継続(task_continuation_2)\n";
for (int i = 0; i < n - m; i++)
for (int j = 0; j < n - m; j++)
a += d;
cout << "・・・・・・task_continuation_2 完了\n";
});
cout << "・・・・・・待機中の別作業\n";
cout << "(1) a = " << a << '\n';
cout << "(2) a = " << a << '\n';
cout << "(3) a = " << a << '\n';
cout << "・・・・・・まだ待機中\n";
task_start.wait();
cout << "(★) a = " << a << '\n';
task_continuation_1.wait();
cout << "(★) a = " << a << '\n';
task_continuation_2.wait();
cout << "(★) a = " << a << '\n';
}
以下はプログラム実行結果です(2回実行しました)。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7792432
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック