Aracılığıyla paylaş


Adım adım işlem aşamaları: Vadeli işlem uygulama

Bu konu, vadeli işlem uygulamanızda uygulamak gösterilmiştir. Konuyu daha fazla yapan varolan işlevsellik eşzamanlılık çalışma zamanında bir şey birleştirmek gösterilmiştir.

Önemli

Bu konuda gösterim amacıyla vadeli işlem kavramını göstermektedir.Sizin kullanmanızı öneririz std::future veya concurrency::task gerektiren, daha sonra kullanmak için bir değer hesaplar zaman uyumsuz bir görev.

A görev ek, daha hassas hesaplamaların decomposed hesaplaması olur. A gelecek daha sonra kullanmak için bir değer hesaplar zaman uyumsuz bir görev.

Vadeli işlem uygulamak için bu konuda tanımlar async_future sınıfı. async_future Sınıfı, bu eşzamanlılık çalışma zamanı bileşenleri kullanır: concurrency::task_group sınıfı ve concurrency::single_assignment sınıfı. async_future Sınıfını kullanan task_group zaman uyumsuz bir değeri hesaplamak için sınıf ve single_assignment hesaplamanın sonucu depolamak için sınıf. Kurucu, async_future sonucu hesaplar iş işlevi sınıf alır ve get yöntemi sonuç alır.

Async_future sınıfı uygulamak için

  1. Adlı bir şablon sınıf bildirmek async_future sonuç hesaplama türüne parametreli. Ekleme public ve private bölümlerde bu sınıfa.

    template <typename T>
    class async_future
    {
    public:
    private:
    };
    
  2. De private bölümünde async_future sınıfı, bildirdiğiniz bir task_group ve single_assignment veri üyesi.

    // Executes the asynchronous work function.
    task_group _tasks;
    
    // Stores the result of the asynchronous work function.
    single_assignment<T> _value;
    
  3. De public bölümünde async_future sınıfı, yapıcı uygulamak. Yapıcı iş işlevi sonuç hesaplar parametreli bir şablondur. Yapıcı iş işlevinde eşzamansız olarak yürütür task_group veri üyesi ve kullanımları concurrency::send işlevinin sonucu yaz single_assignment veri üyesi.

    template <class Functor>
    explicit async_future(Functor&& fn)
    {
       // Execute the work function in a task group and send the result
       // to the single_assignment object.
       _tasks.run([fn, this]() {
          send(_value, fn());
        });
    }
    
  4. De public bölümünde async_future sınıfı, yıkıcı uygulamak. Yıkıcı, görevin tamamlanmasını bekler.

    ~async_future()
    {
       // Wait for the task to finish.
       _tasks.wait();
    }
    
  5. De public bölümünde async_future sınıf, uygulama get yöntemi. Bu yöntemi kullanan concurrency::receive iş işlevinin sonucu almak için işlevi.

    // Retrieves the result of the work function.
    // This method blocks if the async_future object is still 
    // computing the value.
    T get()
    { 
       return receive(_value); 
    }
    

Örnek

Dd764564.collapse_all(tr-tr,VS.110).gifDescription

Aşağıdaki örnek tam gösterir async_future sınıfı ve onun kullanım örneği. wmain İşlev oluşturur bir std::vector 10.000 rasgele tamsayı değerleri içeren nesne. Daha sonra kullanır async_future bulunan en küçük ve en büyük değerleri bulmak için nesnenin vector nesnesi.

Dd764564.collapse_all(tr-tr,VS.110).gifKod

// futures.cpp
// compile with: /EHsc
#include <ppl.h>
#include <agents.h>
#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>
#include <random>

using namespace concurrency;
using namespace std;

template <typename T>
class async_future
{
public:
   template <class Functor>
   explicit async_future(Functor&& fn)
   {
      // Execute the work function in a task group and send the result
      // to the single_assignment object.
      _tasks.run([fn, this]() {
         send(_value, fn());
       });
   }

   ~async_future()
   {
      // Wait for the task to finish.
      _tasks.wait();
   }

   // Retrieves the result of the work function.
   // This method blocks if the async_future object is still 
   // computing the value.
   T get()
   { 
      return receive(_value); 
   }

private:
   // Executes the asynchronous work function.
   task_group _tasks;

   // Stores the result of the asynchronous work function.
   single_assignment<T> _value;
};

int wmain()
{
   // Create a vector of 10000 integers, where each element 
   // is between 0 and 9999.
   mt19937 gen(2);
   vector<int> values(10000);   
   generate(begin(values), end(values), [&gen]{ return gen()%10000; });

   // Create a async_future object that finds the smallest value in the
   // vector.
   async_future<int> min_value([&]() -> int { 
      int smallest = INT_MAX;
      for_each(begin(values), end(values), [&](int value) {
         if (value < smallest)
         {
            smallest = value;
         }
      });
      return smallest;
   });

   // Create a async_future object that finds the largest value in the
   // vector.
   async_future<int> max_value([&]() -> int { 
      int largest = INT_MIN;
      for_each(begin(values), end(values), [&](int value) {
         if (value > largest)
         {
            largest = value;
         } 
      });
      return largest;
   });

   // Calculate the average value of the vector while the async_future objects
   // work in the background.
   int sum = accumulate(begin(values), end(values), 0);
   int average = sum / values.size();

   // Print the smallest, largest, and average values.
   wcout << L"smallest: " << min_value.get() << endl
         << L"largest:  " << max_value.get() << endl
         << L"average:  " << average << endl;
}

Dd764564.collapse_all(tr-tr,VS.110).gifComments

Bu örnek aşağıdaki çıktıyı üretir:

smallest: 0
largest:  9999
average:  4981

Örnek async_future::get hesaplama sonuçlarını almak için yöntem. async_future::get Yöntemi SD SD hala etkinse bitmesini bekler.

Güçlü programlama

Genişletmek için async_future sınıf değiştirmek iş işlevi tarafından atılan özel durumlarý iþlemek için async_future::get yöntemini çağırmak için concurrency::task_group::wait yöntemi. task_group::wait Yöntemi iş işlevi tarafından oluşturulan herhangi bir özel durum atar.

Aşağıdaki örnek, değiştirilmiş sürümünü gösterir async_future sınıfı. wmain İşlevini kullanan bir try-catch sonucunu yazdırmak için blok async_future nesne veya çalışma işlevi tarafından oluşturulan özel durum değerini yazdırmak için.

// futures-with-eh.cpp
// compile with: /EHsc
#include <ppl.h>
#include <agents.h>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace concurrency;
using namespace std;

template <typename T>
class async_future
{
public:
   template <class Functor>
   explicit async_future(Functor&& fn)
   {
      // Execute the work function in a task group and send the result
      // to the single_assignment object.
      _tasks.run([fn, this]() {
         send(_value, fn());
       });
   }

   ~async_future()
   {
      // Wait for the task to finish.
      _tasks.wait();
   }

   // Retrieves the result of the work function.
   // This method blocks if the async_future object is still
   // computing the value.
   T get()
   { 
      // Wait for the task to finish.
      // The wait method throws any exceptions that were generated
      // by the work function.
      _tasks.wait();

      // Return the result of the computation.
      return receive(_value);
   }

private:
   // Executes the asynchronous work function.
   task_group _tasks;

   // Stores the result of the asynchronous work function.
   single_assignment<T> _value;
};

int wmain()
{
   // For illustration, create a async_future with a work 
   // function that throws an exception.
   async_future<int> f([]() -> int { 
      throw exception("error");
   });

   // Try to read from the async_future object. 
   try
   {
      int value = f.get();
      wcout << L"f contains value: " << value << endl;
   }
   catch (const exception& e)
   {
      wcout << L"caught exception: " << e.what() << endl;
   }
}

Bu örnek aşağıdaki çıktıyı üretir:

caught exception: error

Eşzamanlılık çalışma zamanında özel durum işleme modeli hakkında daha fazla bilgi için bkz: Özel durum işleme eşzamanlılık çalışma zamanında.

Kod Derleniyor

Örnek kodu kopyalayın ve Visual Studio Project'te yapıştırın veya adlı bir dosyaya yapıştırın futures.cpp ve Visual Studio komut istemi penceresinde aşağıdaki komutu çalıştırın.

cl.exe /EHsc futures.cpp

Ayrıca bkz.

Başvuru

task_group sınıfı

single_assignment sınıfı

Kavramlar

Özel durum işleme eşzamanlılık çalışma zamanında

Diğer Kaynaklar

Eşzamanlılık çalışma zamanı izlenecek yollar