Aracılığıyla paylaş


Zaman uyumsuz ileti blokları

Aracıları kitaplığı, uygulama bileşenleri arasında ileti iş parçacığı güvenli bir şekilde yayılmasına olanak veren birkaç ileti bloğu türü sağlar. Bu ileti bloğu türleri genellikle çeşitli ileti geçirme yordamları ile kullanılan concurrency::send, concurrency::asend, concurrency::receive, ve concurrency::try_receive. İleti aracıları kitaplığı tarafından tanımlanan yordamlar hakkında daha fazla bilgi için bkz: İleti gönderme fonksiyonları.

Bölümler

Bu konu aşağıdaki bölümleri içerir:

  • Kaynaklar ve hedefler

  • İleti yayma

  • İleti Bloğu türlerine genel bakış

  • unbounded_buffer sınıfı

  • overwrite_buffer sınıfı

  • single_assignment sınıfı

  • Çağrı sınıfı

  • Transformer sınıfı

  • seçenek sınıfı

  • birleştirme ve multitype_join sınıfları

  • Timer sınıfı

  • İleti filtreleme

  • İleti rezervasyon

Kaynaklar ve hedefler

Kaynaklar ve hedefler ileti iki önemli katılımcıları şunlardır. A kaynak iletileri gönderir iletişimi bir son nokta için yapar. A hedef iletileri alır iletişim bir son nokta için yapar. Okuduğunuz bir bitiş noktası olarak bir kaynak ve hedef için yazdığınız son nokta olarak düşünebilirsiniz. Uygulamalar, forma kaynaklar ve hedefler birbirine bağlanmak ileti.

Kaynaklar ve hedefler göstermek için iki soyut sınıflar aracıları kitaplığı kullanır: concurrency::ISource ve concurrency::ITarget. İleti Bloğu gibi kaynaklardan öğesinden türetilmeli, act türleri ISource; İleti Bloğu gibi hedefleri öğesinden türetilmeli, act türleri ITarget. İleti Bloğu kaynağı olarak bu eylemi türleri ve hedefleri türetmek her ikisini de ISource ve ITarget.

Top

İleti yayma

İleti yayma bir bileşenden ileti gönderme işlemidir. Bir iletinin ileti bloğu sunulduğunda, bunu kabul etmek, reddetme veya ileti ertelemek. Her ileti bloğu türü saklar ve farklı şekillerde iletileri iletir. Örneğin, unbounded_buffer sınıf iletileri, sınırsız sayıda depolar overwrite_buffer sınıfı bir kerede tek bir ileti saklar ve dönüştürücü sınıf her ileti değiştirilmiş bir sürümünü saklar. Bu ileti bloğu türleri, bu belgede daha sonra daha ayrıntılı açıklanmıştır.

Bir iletinin ileti bloğu kabul ettiğinde, isteğe bağlı olarak iş yapmak ve, ileti bloğu bir kaynak ise, ağdaki başka bir üyesi elde edilen ileti geçişi. İleti Bloğu almak istemediği iletileri reddetmek için bir filtre işlevini kullanabilirsiniz. Filtreler bölümünde, bu konunun ilerisinde daha ayrıntılı açıklanan İleti filtreleme. Bir ileti erteleyen bir ileti bloğu ileti ayırmak ve daha sonra tüketebilir. İleti rezervasyon daha fazla ayrıntı bölümünde, bu konunun ilerisinde açıklanan İleti rezervasyon.

Aracıları kitaplığı, zaman uyumsuz ileti blokları sağlar veya sıradaki iletileri iletmek. Ne zaman geçirmek bir ileti için ileti bloğu, örneğin, kullanarak send işlev, çalışma zamanı engeller geçerli içerik kadar hedef blok kabul eder veya iletiyi reddeder. Ne zaman geçirmek bir ileti için ileti bloğu zaman uyumsuz olarak, örneğin, kullanarak asend işlevi, ileti hedef çalışma zamanı sunar ve hedef ileti kabul ederse, çalışma zamanı alıcı iletiyi yayar zaman uyumsuz bir görev zamanlar. Çalışma zamanı, iletileri işbirliği yapan bir şekilde yaymak için basit görevleri kullanır. Basit görevler hakkında daha fazla bilgi için bkz: Görev Zamanlayıcı'yı (eşzamanlılık çalışma zamanı).

Uygulamaları kaynaklar ve hedefler ileti formu bağlamak. Arama ve ağ bağlantı genellikle, send veya asend ağ verilerini geçirmek için. Kaynak ileti bloğu hedefe bağlanmak için çağrı concurrency::ISource::link_target yöntemi. Hedef kaynak bloğu bağlantısını kesmek için arama concurrency::ISource::unlink_target yöntemi. Kaynak Blokla tüm hedeflerine kesmek için çağrı concurrency::ISource::unlink_targets yöntemi. Önceden tanımlı ileti bloğu türlerinden birini kapsam bırakır veya yok edilir, onu otomatik olarak kendisini herhangi bir hedef bloklarından keser. Bazı ileti bloğu türleri için yazabilirsiniz hedefleri maksimum sayısını kısıtlayın. Aşağıdaki bölümde önceden tanımlı ileti bloğu türlerine uygulanan kısıtlamalar açıklanmaktadır.

Top

İleti Bloğu türlerine genel bakış

Aşağıdaki tabloda kısaca önemli ileti bloğu türlerini açıklar.

  • unbounded_buffer
    Sıra iletileri saklar.

  • overwrite_buffer
    Bir ileti yazılır ve birden çok kez okuma depolar.

  • single_assignment
    Bir ileti için bir kez yazılır ve birden çok kez okuma depolar.

  • Çağrı
    Bir ileti aldığında, iş yapar.

  • Transformer
    İş verileri alır ve bu çalışmanın sonucu için başka bir hedef blok gönderir gerçekleştirir. transformer Farklı giriş ve çıkış türleri üzerinde sınıf görebilir.

  • Seçim
    İlk kullanılabilir ileti kümesi kaynakları seçer.

  • birleştirme ve multitype birleştirme
    Tüm iletileri kümesi kaynakları alınması ve daha sonra başka bir ileti bloğu için bir ileti içine iletileri birleştirmek bekleyin.

  • Timer
    Bir iletiyi bir hedef blok normal aralığa göre gönderir.

Bu ileti bloğu farklı durumlar için kullanışlı hale getirmek farklı özellikleri vardır. Bazı özellikleri şunlardır:

  • Yayma türü: olup ileti bloğu kaynak verileri, verilerin bir alıcı veya ikisinin olarak davranır.

  • İleti sırası: ileti bloğu içinde ileti gönderilen veya alınan orijinal sipariş mi korur. Her önceden tanımlı ileti bloğu türü, gönderdiğinde veya iletileri aldığında orijinal düzenini korur.

  • Kaynak sayısı: ileti bloğu ortamlardan okuma kaynakları en fazla sayısı.

  • Hedef sayısı: ileti bloğu yazabilirler hedefleri en fazla sayısı.

Aşağıdaki tabloda, bu özelliklere nasıl bir ileti bloğu çeşitli ilişki gösterilmektedir.

İleti bloğu türü

Yayma türü (kaynak, hedef veya her ikisi)

Sıralama (sipariş edilmiş veya Unordered) iletisi

Kaynak sayısı

Hedef sayısı

unbounded_buffer

Her ikisi de

Sipariş

Sınırlandırılmamış

Sınırlandırılmamış

overwrite_buffer

Her ikisi de

Sipariş

Sınırlandırılmamış

Sınırlandırılmamış

single_assignment

Her ikisi de

Sipariş

Sınırlandırılmamış

Sınırlandırılmamış

call

Target

Sipariş

Sınırlandırılmamış

Uygulanamaz

transformer

Her ikisi de

Sipariş

Sınırlandırılmamış

1

choice

Her ikisi de

Sipariş

10

1

join

Her ikisi de

Sipariş

Sınırlandırılmamış

1

multitype_join

Her ikisi de

Sipariş

10

1

timer

Kaynak

Uygulanamaz

Uygulanamaz

1

Aşağıdaki bölümlerde daha ayrıntılı ileti bloğu türleri açıklanmaktadır.

Top

unbounded_buffer sınıfı

Concurrency::unbounded_buffer sınıfı, bir genel amaçlı zaman uyumsuz ileti yapısını temsil eder. Bu sınıf, bir ilk giren ilk çıkar (FIFO) sıra için birden çok kaynak tarafından yazılan veya birden çok hedefi tarafından okunan iletilerin depolar. Hedef, bir ileti aldığında bir unbounded_buffer bu iletiyi ileti sırasından kaldırılan nesne. Bu nedenle, ancak bir unbounded_buffer nesne birden çok hedefi olabilir, her ileti yalnızca bir hedef alabilir. unbounded_buffer Sınıfı, başka bir bileşen için birden çok ileti iletmek istediğinizde ve bu bileşen her ileti alması gerekir yararlıdır.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir unbounded_buffer sınıfı. Bu örnek, üç değerlere gönderir bir unbounded_buffer nesne ve daha sonra bu değerleri aynı nesneden okur.

// unbounded_buffer-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Create an unbounded_buffer object that works with
   // int data.
   unbounded_buffer<int> items;

   // Send a few items to the unbounded_buffer object.
   send(items, 33);
   send(items, 44);
   send(items, 55);

   // Read the items from the unbounded_buffer object and print
   // them to the console.
   wcout << receive(items) << endl;
   wcout << receive(items) << endl;
   wcout << receive(items) << endl;
}

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

33
44
55

Tam nasıl kullanılacağını gösteren bir örnek için unbounded_buffer sınıfı için bkz: Nasıl yapılır: çeşitli Producer tüketici desenleri uygulamak.

Top

overwrite_buffer sınıfı

Concurrency::overwrite_buffer benzer sınıfı unbounded_buffer sınıfı, dışında bir overwrite_buffer nesnesi yalnızca bir ileti saklar. Buna ek olarak, hedef aldığında bir iletiden bir overwrite_buffer nesne ileti arabelleğinden kaldırılmaz. Bu nedenle, birden çok hedefi, iletinin bir kopyasını alırsınız.

overwrite_buffer Sınıfı, başka bir bileşen için birden çok ileti iletmek istediğiniz, ancak bu bileşenin en son değer gerekir yararlıdır. Bu sınıf ayrıca birden çok bileşen için bir ileti yayınlamak istediğinizde yararlıdır.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir overwrite_buffer sınıfı. Bu örnek, üç değerlere gönderir bir overwrite _buffer nesne ve daha sonra aynı nesneden üç kez geçerli değerini okur. Bu örnek için örneğe benzer unbounded_buffer sınıfı. Ancak, overwrite_buffer sınıfı, yalnızca bir ileti saklar. Buna ek olarak, çalışma zamanı iletisinden kaldırılmaz bir overwrite_buffer onu okuduktan sonra nesne.

// overwrite_buffer-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Create an overwrite_buffer object that works with
   // int data.
   overwrite_buffer<int> item;

   // Send a few items to the overwrite_buffer object.
   send(item, 33);
   send(item, 44);
   send(item, 55);

   // Read the current item from the overwrite_buffer object and print
   // it to the console three times.
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
}

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

55
55
55

Tam nasıl kullanılacağını gösteren bir örnek için overwrite_buffer sınıfı için bkz: Nasıl yapılır: çeşitli Producer tüketici desenleri uygulamak.

Top

single_assignment sınıfı

Concurrency::single_assignment benzer sınıfı overwrite_buffer sınıfı, dışında bir single_assignment nesne yalnızca bir kez yazılmış. Gibi overwrite_buffer gelen bir iletiyi bir hedef aldığında, sınıf bir single_assignment nesne ileti o nesnesinden kaldırılmaz. Bu nedenle, birden çok hedefi, iletinin bir kopyasını alırsınız. single_assignment Sınıfı, birden çok bileşen için bir ileti yayınlamak istediğinizde yararlıdır.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir single_assignment sınıfı. Bu örnek, üç değerlere gönderir bir single_assignment nesne ve daha sonra aynı nesneden üç kez geçerli değerini okur. Bu örnek için örneğe benzer overwrite_buffer sınıfı. Ancak hem overwrite_buffer ve single_assignment sınıfları tek bir ileti deposu single_assignment sınıfı yalnızca bir kez yazılmış.

// single_assignment-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Create an single_assignment object that works with
   // int data.
   single_assignment<int> item;

   // Send a few items to the single_assignment object.
   send(item, 33);
   send(item, 44);
   send(item, 55);

   // Read the current item from the single_assignment object and print
   // it to the console three times.
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
   wcout << receive(item) << endl;
}

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

33
33
33

Tam nasıl kullanılacağını gösteren bir örnek için single_assignment sınıfı için bkz: Adım adım işlem aşamaları: Vadeli işlem uygulama.

Top

Çağrı sınıfı

Concurrency::call verileri aldığında, iş işlevi gerçekleştiren bir ileti alıcısı sınıf görevi görür. Bu iş işlevi lambda ifadesi, işlev nesne veya işlev işaretçisi olabilir. A call nesne davranır sıradan bir işlev çağrısı farklı paralel olarak göndermek için diğer bileşenleri davrandığından. Yoksa bir call nesnesi işlemi uyguluyor iş bir ileti aldığında, iletinin sıraya ekler. Her call nesnesi işlemler sırayla, bunlar alınan iletiler sıraya.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir call sınıfı. Bu örnek oluşturur bir call yazdırır konsol aldığı her değer nesnesi. Örnek için üç değerden sonra gönderir call nesnesi. Çünkü call nesnesini işler iletileri ayrı bir iş parçacığı üzerinde bu örnek ayrıca Sayaç değişkenini kullanır ve bir olay emin olmak için nesne call nesnesini önce tüm iletileri işler wmain işlevini verir.

// call-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // An event that is set when the call object receives all values.
   event received_all;

   // Counts the 
   long receive_count = 0L;
   long max_receive_count = 3L;

   // Create an call object that works with int data.
   call<int> target([&received_all,&receive_count,max_receive_count](int n) {
      // Print the value that the call object receives to the console.
      wcout << n << endl;

      // Set the event when all messages have been processed.
      if (++receive_count == max_receive_count)
         received_all.set();
   });

   // Send a few items to the call object.
   send(target, 33);
   send(target, 44);
   send(target, 55);

   // Wait for the call object to process all items.
   received_all.wait();
}

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

33
44
55

Tam nasıl kullanılacağını gösteren bir örnek için call sınıfı için bkz: Nasıl yapılır: çağrı ve transformer sınıflar çalışma işlevleri sağlayan.

Top

Transformer sınıfı

Concurrency::transformer her iki ileti alıcısı ve iletinin göndereni olarak sınıf davranır. transformer Benzer sınıfı call verileri aldığında, bir kullanıcı tanımlı iş işlevi yerine getirir çünkü sınıf. Ancak, transformer sınıfı ayrıca iş işlevinin sonucu alıcı nesneleri gönderir. Gibi bir call nesnesi, bir transformer paralel olarak göndermek için diğer bileşenleri nesne davranır. Yoksa bir transformer nesnesi işlemi uyguluyor iş bir ileti aldığında, iletinin sıraya ekler. Her transformer nesne içinde aldığı sırada sıraya alınan iletileri işler.

transformer Sınıfı, bir hedef için kendi iletisi gönderir. Ayarlarsanız, _PTarget yapıcı parametre NULL, daha sonra çağırarak hedefi belirtebilirsiniz concurrency::link_target yöntemi.

Aksine aracıları kitaplığı tarafından sağlanan diğer tüm zaman uyumsuz ileti bloğu türleri transformer farklı giriş ve çıkış türleri üzerinde sınıf görebilir. Bu türden verileri başka bir hale gelmesi için dönüştürme yeteneği transformer önemli bir bileşen de birçok eşzamanlı ağ sınıf. Buna ek olarak, iş işlevi daha fazla belirtilecek paralel işlevsellik ekleyebilirsiniz bir transformer nesnesi.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir transformer sınıfı. Bu örnek oluşturur bir transformer çarpan her giriş nesne int değeri üretmek için 0.33 tarafından bir double değeri olarak çıktı. Örnek sonra dönüştürülmüş değerleri aynı alır transformer nesne ve onları konsola yazdırır.

// transformer-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Create an transformer object that receives int data and 
   // sends double data.
   transformer<int, double> third([](int n) {
      // Return one-third of the input value.
      return n * 0.33;
   });

   // Send a few items to the transformer object.
   send(third, 33);
   send(third, 44);
   send(third, 55);

   // Read the processed items from the transformer object and print
   // them to the console.
   wcout << receive(third) << endl;
   wcout << receive(third) << endl;
   wcout << receive(third) << endl;
}

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

10.89
14.52
18.15

Tam nasıl kullanılacağını gösteren bir örnek için transformer sınıfı için bkz: Nasıl yapılır: veri potansiyel kullanım transformer.

Top

seçenek sınıfı

Concurrency::choice sınıf kümesi kaynakları kullanılabilir ilk iletiyi seçer. choice Dataflow mekanizması yerine akış denetimi mekanizması sınıfı gösterir (konu Zaman uyumsuz aracıları kitaplığı dataflow ve akış denetimi arasındaki farklar anlatılmaktadır).

Seçtiğiniz nesne okuma benzer Windows API işlevi çağırmadan WaitForMultipleObjects ne zaman sahip bWaitAll parametresini ayarlamak FALSE. Ancak, choice sınıfı olay kendisi yerine dış eşitleme nesnesi veri bağlar.

Genellikle kullandığınız choice ile birlikte sınıf concurrency::receive akış denetimi uygulamanızda sürücü için işlevi. Use choice sınıf farklı türleri arasında ileti arabellekleri seçmek üzere olduğunda. Use single_assignment sınıf aynı türe sahip ileti arabelleği seçmek, varsa.

Kaynaklar için bağlantı sırası bir choice nesne önemli olduğunu çünkü ileti seçili belirleyebilirsiniz. Örneğin, bir ileti içeren birden çok ileti arabelleği bağlantı yeri durumu düşünün bir choice nesnesi. choice Nesne bağlantılı olduğu ilk kaynaktan iletiyi seçer. Tüm kaynakları bağlantı sonra choice her kaynak aldığı bir ileti sırası nesnesi korur.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir choice sınıfı. Bu örnek concurrency::make_choice işlevi oluşturmak için bir choice arasında üç ileti blokları seçer nesnesi. Örneğin Fibonacci sayıları çeşitli hesaplar ve her sonuç farklı ileti bloğunda depolar. Örnek, sonra konsola bittiği ilk işlem tabanlı bir ileti yazdırır.

// choice-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <ppl.h>
#include <iostream>

using namespace concurrency;
using namespace std;

// Computes the nth Fibonacci number.
// This function illustrates a lengthy operation and is therefore
// not optimized for performance.
int fibonacci(int n)
{
   if (n < 2)
      return n;
   return fibonacci(n-1) + fibonacci(n-2);
}

int wmain()
{
   // Although the following thee message blocks are written to one time only, 
   // this example illustrates the fact that the choice class works with 
   // different message block types.

   // Holds the 35th Fibonacci number.
   single_assignment<int> fib35;
   // Holds the 37th Fibonacci number.
   overwrite_buffer<int> fib37;
   // Holds half of the 42nd Fibonacci number.
   unbounded_buffer<double> half_of_fib42;   

   // Create a choice object that selects the first single_assignment 
   // object that receives a value.
   auto select_one = make_choice(&fib35, &fib37, &half_of_fib42);

   // Execute a few lengthy operations in parallel. Each operation sends its 
   // result to one of the single_assignment objects.
   parallel_invoke(
      [&fib35] { send(fib35, fibonacci(35)); },
      [&fib37] { send(fib37, fibonacci(37)); },
      [&half_of_fib42] { send(half_of_fib42, fibonacci(42) * 0.5); }
   );

   // Print a message that is based on the operation that finished first.
   switch (receive(select_one))
   {
   case 0:
      wcout << L"fib35 received its value first. Result = " 
            << receive(fib35) << endl;
      break;
   case 1:
      wcout << L"fib37 received its value first. Result = " 
            << receive(fib37) << endl;
      break;
   case 2:
      wcout << L"half_of_fib42 received its value first. Result = " 
            << receive(half_of_fib42) << endl;
      break;
   default:
      wcout << L"Unexpected." << endl;
      break;
   }
}

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

fib35 received its value first. Result = 9227465

Çünkü 35 hesaplar görevth Fibonacci sayı ilk bitirmek için garanti değil, bu örneğin çıkış değişebilir.

Bu örnek concurrency::parallel_invoke paralel Fibonacci sayıları hesaplamak için bir algoritma. parallel_invoke hakkında daha fazla bilgi için, bkz. Paralel algoritmalar.

Tam nasıl kullanılacağını gösteren bir örnek için choice sınıfı için bkz: Nasıl yapılır: arasında tamamlanan görevleri Seç.

Top

birleştirme ve multitype_join sınıfları

Concurrency::join ve concurrency::multitype_join bir ileti almak her üye bir kaynak kümesi için bekleyin sınıfları sağlar. join Ortak bir ileti türü sahip kaynak nesnelerin sınıf davranır. multitype_join Farklı ileti türleri olan kaynak nesnelerin sınıf davranır.

Okurken bir join veya multitype_join nesne benzer Windows API işlevi çağırmadan WaitForMultipleObjects ne zaman sahip bWaitAll parametresini ayarlamak TRUE. Ancak, olduğu gibi bir choice nesnesi, join ve multitype_join nesneler veri olayı kendisi yerine dış eşitleme nesnesine bağlayan bir olay mekanizması kullanır.

Okurken bir join nesnesini oluşturan bir std::vector nesnesi. Okurken bir multitype_join nesnesini oluşturan bir std::tuple nesnesi. Öğeleri görünür bu nesnelerde aynı sırada karşılık gelen kaynak önbelleklerini bağlı olarak join veya multitype_join nesnesi. Kaynak bağlantı sırası arabelleğe alır çünkü bir join veya multitype_join kaynaklanan, öğelerin sırası ile ilişkili nesne vector veya tuple nesne, varolan bir kaynak arabelleğini birleştirme alanından ayırmak değil öneririz. Böylece belirtilmeyen davranışlara neden.

Dd504833.collapse_all(tr-tr,VS.110).gifDoyumsuz doyumsuz karşı birleştirir.

join Ve multitype_join sınıfları, doyumsuz ve doyumsuz olmayan birleşimler kavramını destekler. A doyumsuz JOIN kullanılabilir tüm ileti kadar iletiler kullanılabilir duruma geldiğinde, kaynaklardan gelen bir iletiyi kabul eder. A doyumsuz JOIN iki aşamada iletileri alır. İlk olarak, her kaynaklarının bir ileti sunulur kadar doyumsuz olmayan bir birleşim bekler. İkinci olarak, tüm kaynak iletileri sonra doyumsuz olmayan bir birleşim her iletileri ayırmak çalışır. Her iletinin rezerve edebilirsiniz, tüm iletileri tüketir ve bunları kendi hedef yayar. Aksi halde, onu bırakır, veya ileti rezervasyonları iptal ve yeniden bir ileti almak her kaynak için bekler.

İletileri hemen kabul doyumsuz birleşimler doyumsuz olmayan birleşimler daha iyi gerçekleştirin. Ancak, nadiren de olsa, doyumsuz birleşimler kilitlenmeleri için yol açabilir. Bir veya birden çok paylaşılan kaynak nesneleri içeren birden fazla birleşim varsa, doyumsuz olmayan bir birleşim kullanın.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir join sınıfı. Bu örnek concurrency::make_join işlevi oluşturmak için bir join üç aldığı nesne single_assignment nesneler. Bu örnek, Fibonacci sayıları çeşitli hesaplar, her sonuç farklı bir saklar single_assignment nesnesini ve sonra baskı konsola her neden olan join nesne holds. Bu örnek için örneğe benzer choice , dışında sınıf join class beklediği tüm kaynak ileti blokları bir ileti alırsınız.

// join-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <ppl.h>
#include <iostream>

using namespace concurrency;
using namespace std;

// Computes the nth Fibonacci number.
// This function illustrates a lengthy operation and is therefore
// not optimized for performance.
int fibonacci(int n)
{
   if (n < 2)
      return n;
   return fibonacci(n-1) + fibonacci(n-2);
}

int wmain()
{
   // Holds the 35th Fibonacci number.
   single_assignment<int> fib35;
   // Holds the 37th Fibonacci number.
   single_assignment<int> fib37;
   // Holds half of the 42nd Fibonacci number.
   single_assignment<double> half_of_fib42;   

   // Create a join object that selects the values from each of the
   // single_assignment objects.
   auto join_all = make_join(&fib35, &fib37, &half_of_fib42);

   // Execute a few lengthy operations in parallel. Each operation sends its 
   // result to one of the single_assignment objects.
   parallel_invoke(
      [&fib35] { send(fib35, fibonacci(35)); },
      [&fib37] { send(fib37, fibonacci(37)); },
      [&half_of_fib42] { send(half_of_fib42, fibonacci(42) * 0.5); }
   );

   auto result = receive(join_all);
   wcout << L"fib35 = " << get<0>(result) << endl;
   wcout << L"fib37 = " << get<1>(result) << endl;
   wcout << L"half_of_fib42 = " << get<2>(result) << endl;
}

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

fib35 = 9227465
fib37 = 24157817
half_of_fib42 = 1.33957e+008

Bu örnek concurrency::parallel_invoke paralel Fibonacci sayıları hesaplamak için bir algoritma. parallel_invoke hakkında daha fazla bilgi için, bkz. Paralel algoritmalar.

Nasıl kullanacağınızı gösteren tam örnek için join sınıfı için bkz: Nasıl yapılır: arasında tamamlanan görevleri Seç ve İzlenecek yol: kilitlenme önlemek için JOIN kullanmak.

Top

Timer sınıfı

Concurrency::timer ileti kaynağını sınıf görevi görür. A timer nesne belirli bir süre geçtikten sonra bu ileti bir hedefe gönderir. timer Sınıfı, bir ileti gönderirken gecikme gerekir veya düzenli aralıklarla ileti göndermek istediğinizde kullanışlıdır.

timer Sınıfı, tek bir hedefe kendi iletisi gönderir. Ayarlarsanız, _PTarget yapıcı parametre NULL, daha sonra çağırarak hedefi belirtebilirsiniz concurrency::ISource::link_target yöntemi.

A timer nesnesi yinelenen veya yinelenmeyen. Yinelenen bir Zamanlayıcı oluşturmak için true için _Repeating çağırdığınız parametresi. Aksi takdirde geçmesi false için _Repeating yinelenmeyen bir süreölçer parametresi. Süreölçer yinelenen, her zaman aralığından sonra hedef aynı iletiyi gönderir.

Aracıları kitaplığı oluşturur timer başladı durumdaki nesneler. Timer nesnesi başlatma çağrısı concurrency::timer::start yöntemi. Durdurmak için bir timer nesne, nesne veya çağrı yok concurrency::timer::stop yöntemi. Yinelenen Süreölçeri Duraklat çağrısı concurrency::timer::pause yöntemi.

Dd504833.collapse_all(tr-tr,VS.110).gifÖrnek

Aşağıdaki örnek çalışma temel yapısını gösterir timer sınıfı. Örnek timer ve call uzun bir işlem ilerlemesini raporlamak için nesneler.

// timer-structure.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

// Computes the nth Fibonacci number.
// This function illustrates a lengthy operation and is therefore
// not optimized for performance.
int fibonacci(int n)
{
   if (n < 2)
      return n;
   return fibonacci(n-1) + fibonacci(n-2);
}

int wmain()
{
   // Create a call object that prints characters that it receives 
   // to the console.
   call<wchar_t> print_character([](wchar_t c) {
      wcout << c;
   });

   // Create a timer object that sends the period (.) character to 
   // the call object every 100 milliseconds.
   timer<wchar_t> progress_timer(100u, L'.', &print_character, true);

   // Start the timer.
   wcout << L"Computing fib(42)";
   progress_timer.start();

   // Compute the 42nd Fibonacci number.
   int fib42 = fibonacci(42);

   // Stop the timer and print the result.
   progress_timer.stop();
   wcout << endl << L"result is " << fib42 << endl;
}

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

Computing fib(42)..................................................
result is 267914296

Tam nasıl kullanılacağını gösteren bir örnek için timer sınıfı için bkz: Nasıl yapılır: düzenli aralıklarla ileti gönderme.

Top

İleti filtreleme

İleti Bloğu nesnesi oluşturduğunuzda, sizin verdiğiniz bir filtresi işlevini ileti bloğu kabul veya reddeder bir ileti olup olmadığını belirler. Filter işlevi, ileti bloğu yalnızca belirli değerleri alır güvence altına almak için kullanışlı bir yoldur.

Aşağıdaki örnek, nasıl oluşturulacağını gösterir bir unbounded_buffer yalnızca sayıları kabul etmek için bir filtre işlevini kullanan bir nesne. unbounded_buffer Nesne tek sayı reddeder ve onun hedef blok tek sayılara yaymaz.

// filter-function.cpp
// compile with: /EHsc
#include <agents.h>
#include <iostream>

using namespace concurrency;
using namespace std;

int wmain()
{
   // Create an unbounded_buffer object that uses a filter
   // function to accept only even numbers.
   unbounded_buffer<int> accept_evens(
      [](int n) {
         return (n%2) == 0;
      });

   // Send a few values to the unbounded_buffer object.
   unsigned int accept_count = 0;
   for (int i = 0; i < 10; ++i)
   {
      // The asend function returns true only if the target
      // accepts the message. This enables us to determine
      // how many elements are stored in the unbounded_buffer
      // object.
      if (asend(accept_evens, i))
      {
         ++accept_count;
      }
   }

   // Print to the console each value that is stored in the 
   // unbounded_buffer object. The unbounded_buffer object should
   // contain only even numbers.
   while (accept_count > 0)
   {
      wcout << receive(accept_evens) << L' ';
      --accept_count;
   }
}

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

0 2 4 6 8

Filter işlevi, lambda işlevi, işlev işaretçisi veya işlevi nesnesi olabilir. Her filtre işlevi aşağıdaki biçimlerden birini alır.

bool (_Type)
bool (_Type const &)

Gereksiz veri kopyalama kurtulmak için değeri tarafından yayılan bir toplama türü varsa, ikinci formu kullanın.

İleti filtreleme destekler dataflow hangi bileşenleri gerçekleştirmek hesaplamaları veri aldığınızda, programlama modeli. Bir ileti geçirme ağdaki veri akışını denetlemek için filtre işlevlerini kullanın örnekler için bkz: Nasıl yapılır: bir iletiyi engelleme filtresi kullanma, İzlenecek yol: Dataflow Aracısı oluşturma, ve İzlenecek yol: görüntü işleme ağ oluşturma.

Top

İleti rezervasyon

İleti rezervasyon bir ileti daha sonra kullanmak için ayrılacak ileti bloğu sağlar. Genellikle, ileti rezervasyon doğrudan kullanılmaz. Ancak anlama ileti rezervasyon daha iyi yardımcı olabilecek bazı önceden tanımlanmış ileti bloğu türlerinin davranışını anlamak.

Doyumsuz olmayan ve doyumsuz birleşimler dikkate alın. Bunların her ikisi de ileti ayırma iletileri daha sonra kullanmak için rezerve etmek için kullanın. Açıklanan bir önceki doyumsuz olmayan bir birleşim iletileri iki aşamada alır. Birinci aşama, bir olmayan-doyumsuz sırasında join nesne bekler her kaynaklarının bir ileti alırsınız. Doyumsuz birleştirme, daha sonra bu iletilerin her ayırmak çalışır. Her iletinin rezerve edebilirsiniz, tüm iletileri tüketir ve bunları kendi hedef yayar. Aksi halde, onu bırakır, veya ileti rezervasyonları iptal ve yeniden bir ileti almak her kaynak için bekler.

Ayrıca bir dizi kaynaktan girdi iletileri okur, doyumsuz bir birleşim ileti rezervasyon her kaynaktan gelen bir iletiyi almak için beklerken, ek iletileri okumak için kullanır. Örneğin, ileti blokları iletileri alır doyumsuz bir birleşim göz önünde A ve B. Doyumsuz birleştirme b iki iletileri alır, ancak henüz bir iletiden almadı A, doyumsuz birleşim benzersiz ileti tanımlayıcısı için ikinci ileti kaydeder B. Doyumsuz birleştirme gelen bir iletiyi aldıktan sonra A ve yayılan bu iletilere gelen ikinci ileti olmadığını kaydedilmiş ileti tanımlayıcısı kullandığı B hala kullanılabilir.

Kendi özel ileti bloğu türleri geliştirdiğinizde ileti ayırması kullanabilirsiniz. Özel ileti bloğu türü oluşturma hakkında bir örnek için bkz: İzlenecek yol: özel ileti bloğu oluşturma.

Top

Ayrıca bkz.

Kavramlar

Zaman uyumsuz aracıları kitaplığı