방법: 취소를 사용하여 병렬 루프 중단
이 예제에서는 취소를 사용하여 병렬 검색 알고리즘을 구현하는 방법을 보여 줍니다.
예제
다음 예제에서는 취소를 사용하여 배열에서 요소를 검색합니다. 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