Porady: użyj anulowania, aby przerwać pętlę równoległą
W tym przykładzie pokazano, jak za pomocą anulowania zaimplementować podstawowy algorytm wyszukiwania równoległego.
Przykład
W poniższym przykładzie użyto anulowania, aby wyszukać element w tablicy. Funkcja parallel_find_any
używa funkcji concurrency::p arallel_for algorithm i funkcji concurrency::run_with_cancellation_token , aby wyszukać pozycję zawierającą daną wartość. Gdy pętla równoległa znajdzie wartość, wywołuje metodę concurrency::cancellation_token_source::cancel , aby anulować przyszłą pracę.
// 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;
// Call parallel_for in the context of a cancellation token to search for the element.
cancellation_token_source cts;
run_with_cancellation_token([count, what, &a, &position, &cts]()
{
parallel_for(std::size_t(0), count, [what, &a, &position, &cts](int n) {
if (a[n] == what)
{
// Set the return value and cancel the remaining tasks.
position = n;
cts.cancel();
}
});
}, cts.get_token());
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;
}
}
/* Sample output:
3123 is at position 7835.
*/
Współbieżność ::p arallel_for algorytm działa współbieżnie. W związku z tym nie wykonuje ona operacji w wstępnie określonej kolejności. Jeśli tablica zawiera wiele wystąpień wartości, wynik może być dowolną z jego pozycji.
Kompilowanie kodu
Skopiuj przykładowy kod i wklej go w projekcie programu Visual Studio lub wklej go w pliku o nazwie parallel-array-search.cpp
, a następnie uruchom następujące polecenie w oknie wiersza polecenia programu Visual Studio.
cl.exe /EHsc parallel-array-search.cpp
Zobacz też
Anulowanie w PPL
Algorytmy równoległe
parallel_for, funkcja
cancellation_token_source, klasa