Freigeben über


Gewusst wie: Verwenden eines Abbruchs zum Verlassen einer Parallel-Schleife

In diesem Beispiel veranschaulicht die Abbruch verwenden, um einen grundlegende parallele Suchalgorithmus zu implementieren.

Beispiel

Das folgende Beispiel verwendet das Abbrechen, um in einem Array nach einem Element zu suchen.Die parallel_find_any Funktion verwendet die concurrency::parallel_for Algorithmus und der concurrency::run_with_cancellation_token Funktion, um die Position zu suchen, die den angegebenen Wert enthält.Wenn die parallele Schleife den Wert findet, ruft es die Concurrency::cancellation_token_source::cancel -Methode, um zukünftige Aufgaben abzubrechen.

// 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.
*/

Die concurrency::parallel_for Algorithmus gleichzeitig fungiert.Daher führt er die Operationen nicht in einer vorgegebenen Reihenfolge aus.Wenn das Array mehrere Instanzen des Werts enthält, kann das Ergebnis eine beliebige seiner Positionen sein.

Kompilieren des Codes

Kopieren Sie den Beispielcode und fügen Sie ihn in ein Visual Studio Projekt, oder fügen Sie ihn in eine Datei mit dem Namen Parallel-Array-search.cpp und führen Sie den folgenden Befehl in ein Visual Studio-Eingabeaufforderungsfenster.

cl.exe /EHsc parallel-array-search.cpp

Siehe auch

Referenz

parallel_for-Funktion

cancellation_token_source-Klasse

Konzepte

Abbruch in der PPL

Parallele Algorithmen