Udostępnij za pośrednictwem


Jak: wybranie zadania ukończone

W tym przykładzie przedstawiono sposób użycia concurrency::choice i concurrency::join klasy, zaznacz pierwsze zadanie do wykonania algorytm wyszukiwania.

Przykład

W poniższym przykładzie wykonuje dwa algorytmów wyszukiwania równolegle i zaznacza pierwszy algorytm, aby zakończyć.W tym przykładzie definiuje employee typu, który posiada identyfikator numeryczny i wynagrodzenia dla pracownika.find_employee Funkcji znajdzie pierwszy pracownika, który został podany identyfikator lub dostarczonego wynagrodzenia.find_employee Funkcji obsługi przez przypadek, gdy żaden pracownik nie ma podanego identyfikatora lub wynagrodzenia.wmain Funkcja utworzy tablicę employee obiektów i wyszukiwania dla kilku wartości identyfikatora i wynagrodzenia.

W przykładzie użyto choice obiekt, aby wybrać spośród następujących przypadków:

  1. Pracownik, który został podany identyfikator istnieje.

  2. Pracownik, który został podany wynagrodzenia istnieje.

  3. Nie pracownika, który został podany identyfikator lub wynagrodzenia istnieje.

W pierwszych dwóch przypadkach, w przykładzie użyto concurrency::single_assignment obiektu identyfikator i innym single_assignment obiektu przytrzymaj wynagrodzenia.W przykładzie użyto join obiektu w przypadku trzeciego.join Obiekt składa się z dwóch dodatkowych single_assignment obiektów: jeden dla przypadku, gdy istnieje nie został podany identyfikator pracownika i jeden dla przypadku, gdy istnieje nie pracownika, który został podany wynagrodzenia.join Obiekt wysyła wiadomość, gdy każdy z jej członków odbiera wiadomość.W tym przykładzie join obiekt wysyła wiadomość, gdy nie został podany identyfikator pracownika lub istnieje wynagrodzenia.

W przykładzie użyto concurrency::structured_task_group obiekt, aby równolegle zarówno algorytmów wyszukiwania.Każde zadanie wyszukiwania zapisuje w jednym z single_assignment obiektów, aby wskazać, czy istnieje danego pracownika.W przykładzie użyto concurrency::receive funkcję, aby otrzymać indeks pierwszego buforu, który zawiera komunikat i switch bloku do drukowania wynik.

// find-employee.cpp
// compile with: /EHsc
#include <agents.h>
#include <ppl.h>
#include <array>
#include <iostream>
#include <random>

using namespace concurrency;
using namespace std;

// Contains information about an employee.
struct employee
{
   int id;
   float salary;
};

// Finds the first employee that has the provided id or salary.
template <typename T>
void find_employee(const T& employees, int id, float salary)
{
   // Holds the salary for the employee with the provided id.
   single_assignment<float> find_id_result;

   // Holds the id for the employee with the provided salary.
   single_assignment<int> find_salary_result;


   // Holds a message if no employee with the provided id exists.
   single_assignment<bool> id_not_found;

   // Holds a message if no employee with the provided salary exists.
   single_assignment<bool> salary_not_found;

   // Create a join object for the "not found" buffers.
   // This join object sends a message when both its members holds a message 
   // (in other words, no employee with the provided id or salary exists).
   auto not_found = make_join(&id_not_found, &salary_not_found);


   // Create a choice object to select among the following cases:
   // 1. An employee with the provided id exists.
   // 2. An employee with the provided salary exists.
   // 3. No employee with the provided id or salary exists.
   auto selector = make_choice(&find_id_result, &find_salary_result, &not_found);


   // Create a task that searches for the employee with the provided id.
   auto search_id_task = make_task([&]{
      auto result = find_if(begin(employees), end(employees), 
         [&](const employee& e) { return e.id == id; });
      if (result != end(employees))
      {
         // The id was found, send the salary to the result buffer.
         send(find_id_result, result->salary);
      }
      else
      {
         // The id was not found.
         send(id_not_found, true);
      }
   });

   // Create a task that searches for the employee with the provided salary.
   auto search_salary_task = make_task([&]{
      auto result = find_if(begin(employees), end(employees), 
         [&](const employee& e) { return e.salary == salary; });
      if (result != end(employees))
      {
         // The salary was found, send the id to the result buffer.
         send(find_salary_result, result->id);
      }
      else
      {
         // The salary was not found.
         send(salary_not_found, true);
      }
   });

   // Use a structured_task_group object to run both tasks.
   structured_task_group tasks;
   tasks.run(search_id_task);
   tasks.run(search_salary_task);

   wcout.setf(ios::fixed, ios::fixed);
   wcout.precision(2);

   // Receive the first object that holds a message and print a message.
   int index = receive(selector);
   switch (index)
   {
   case 0:
      wcout << L"Employee with id " << id << L" has salary " 
            << receive(find_id_result);
      break;
   case 1:
      wcout << L"Employee with salary " << salary << L" has id " 
            << receive(find_salary_result);
      break;
   case 2:
      wcout << L"No employee has id " << id << L" or salary " << salary;
      break;
   default:
      __assume(0);
   }
   wcout << L'.' << endl;

   // Cancel any active tasks and wait for the task group to finish.
   tasks.cancel();
   tasks.wait();
}

int wmain()
{
   // Create an array of employees and assign each one a 
   // random id and salary.

   array<employee, 10000> employees;

   mt19937 gen(15);
   const float base_salary = 25000.0f;
   for (int i = 0; i < employees.size(); ++i)
   {
      employees[i].id = gen()%100000;

      float bonus = static_cast<float>(gen()%5000);
      employees[i].salary = base_salary + bonus;
   }

   // Search for several id and salary values.

   find_employee(employees, 14758, 30210.00);
   find_employee(employees, 340, 29150.00);
   find_employee(employees, 61935, 29255.90);
   find_employee(employees, 899, 31223.00);
}

Ten przykład generuje następujące wyniki.

Employee with id 14758 has salary 27780.00.
Employee with salary 29150.00 has id 84345.
Employee with id 61935 has salary 29905.00.
No employee has id 899 or salary 31223.00.

W tym przykładzie concurrency::make_choice funkcja helper tworzenia choice obiektów i concurrency::make_join funkcja helper tworzenia join obiektów.

Kompilowanie kodu

Skopiuj przykładowy kod i wklej go w projekcie programu Visual Studio lub wkleić go w pliku o nazwie find-employee.cpp , a następnie uruchom następujące polecenie w oknie wiersza polecenia usługi programu Visual Studio.

cl.exe /EHsc find-employee.cpp

Zobacz też

Informacje

Wybór klasy

Dołącz klasę

Koncepcje

Biblioteka agentów asynchroniczne

Asynchroniczne blokuje wiadomości

Funkcji przekazywania wiadomości