方法: キャンセル処理を使用して並列ループを中断する
この例では、取り消し処理を使用して並列検索アルゴリズムを実装する方法について説明します。
使用例
次の例では、取り消し処理を使用して配列内の要素を検索します。 parallel_find_any 関数は、Concurrency::parallel_for アルゴリズムと Concurrency::structured_task_group オブジェクトを使用して、指定された値を含む位置を検索します。 処理関数は、値を見つけると、Concurrency::structured_task_group::cancel メソッドを呼び出して以降の処理を取り消します。 ランタイムはアクティブなタスクをすべて取り消します。また、新しいタスクを開始しません。
// parallel-array-search.cpp
// compile with: /EHsc
#include <ppl.h>
#include <iostream>
#include <random>
using namespace Concurrency;
using namespace std;
// Returns the position in the provided array that contains the given value,
// or -1 if the value is not in the array.
template<typename T>
int parallel_find_any(const T a[], size_t count, const T& what)
{
// The position of the element in the array.
// The default value, -1, indicates that the element is not in the array.
int position = -1;
// Use parallel_for to search for the element.
// The task group enables a work function to cancel the overall
// operation when it finds the result.
structured_task_group tasks;
tasks.run_and_wait([&]
{
parallel_for(std::size_t(0), count, [&](int n) {
if (a[n] == what)
{
// Set the return value and cancel the remaining tasks.
position = n;
tasks.cancel();
}
});
});
return position;
}
int wmain()
{
const size_t count = 10000;
int values[count];
// Fill the array with random values.
mt19937 gen(34);
for (size_t i = 0; i < count; ++i)
{
values[i] = gen()%10000;
}
// Search for any position in the array that contains value 3123.
const int what = 3123;
int position = parallel_find_any(values, count, what);
if (position >= 0)
{
wcout << what << L" is at position " << position << L'.' << endl;
}
else
{
wcout << what << L" is not in the array." << endl;
}
}
この例のサンプル出力を次に示します。
3123 is at position 4739.
Concurrency::parallel_for アルゴリズムは同時に処理を行います。 したがって、あらかじめ設定されている順序で操作を行うことはありません。 配列に値のインスタンスが複数含まれている場合、結果はそのいずれかの位置になります。
コードのコンパイル
プログラム例をコピーし、Visual Studio プロジェクトに貼り付けるか、parallel-array-search.cpp という名前のファイルに貼り付け、Visual Studio 2010 のコマンド プロンプト ウィンドウで次のコマンドを実行します。
cl.exe /EHsc parallel-array-search.cpp