Aracılığıyla paylaş


Zaman uyumsuz aracıları kitaplığı

Zaman uyumsuz aracıları kitaplığı (veya yalnızca Aracıları kitaplığı) eşzamanlılık etkin uygulama geliştirme sağlamlığını artırmak olanak veren bir programlama modeli sağlar. Bir oyuncu tabanlı programlama modeli ve coarse-grained dataflow için geçirerek ve görevleri ardışık işlem iletisi yükseltir c++ template library aracıları kitaplığıdır. Planlama ve kaynak yönetimi bileşenlerini eşzamanlılık zamanının üzerinde aracıları kitaplığı oluşturur.

Programlama modeli

Aracıları kitaplığı paylaşılan durum alternatifleri, akış denetimi yerine dataflow dayalı bir zaman uyumsuz iletişim modeli aracýlýðýyla Yalıtılmış bileşenlere bağlamanıza izin vererek sağlar. Dataflow başvuran bir programlama modeli burada yalıtımı yapılan tüm veriler gerektiğinde kullanılabilir; Akış denetimi burada hesaplamaları yapıldı önceden belirlenmiş bir sıraya göre bir programlama modeline başvurur.

Dataflow programlama modeli kavramı, ilgili ileti iletme, burada bir programın bağımsız bileşenler iletileri göndererek birbirleriyle.

Aracıları kitaplığı üç bileşenden oluşur: zaman uyumsuz aracıları, zaman uyumsuz ileti blokları, ve ileti iletme işlevlerini. Aracıları durumu korumak ve birbirleriyle ve dış bileşenleriyle iletişim kurmak için ileti blokları ve ileti iletme işlevlerini kullanın. Aracılar ve harici bileşenler gelen iletileri almak ve göndermek ileti geçirme işlevler sağlar. Zaman uyumsuz ileti blokları, iletileri saklamak ve eşzamanlı bir şekilde iletişim kurmak aracıları etkinleştirin.

Aşağıdaki resimde nasıl iki aracıları kullanın ileti blokları ve iletişim kurmak için ileti iletme işlevlerini gösterir. Bu resimde, agent1 bir ileti gönderir agent2 kullanarak concurrency::send işlevi ve bir concurrency::unbounded_buffer nesnesi. agent2kullandığı concurrency::receive işlevi, iletiyi okumak için. agent2bir ileti göndermek için aynı yöntemi kullanan agent1. Kesikli okları aracıları arasındaki veri akışını temsil eder. Düz okları aracıları, yazma veya okuma ileti blokları bağlanın.

Aracılar kitaplığı bileşenleri

Bu resimde uygulayan bir kod örneği, bu konudaki gösterilir.

Aracısı programlama modeli diğer eşzamanlılık ve eşitleme mekanizmaları, olaylar çok sayıda faydası vardır. Nesneler arasındaki durum değişiklikleri iletmek için ileti iletme kullanarak, paylaşılan kaynaklara erişimi yalıtmak ve böylece ölçeklenebilirliği artırmak olduğunu avantajlarından biri. İleti için bir dış eşitleme nesnesi bağlayarak yerine veri eşitleme şekilde bağlar avantajlıdır. Bu bileşenler arasında veri aktarımını basitleştirir ve uygulamalarınızın programlama hatalarını ortadan kaldırabilirsiniz.

Aracıları kitaplığı kullanma zamanı

Zaman uyumsuz olarak birbirleriyle gereken birden fazla işlem olduğunda aracıları kitaplığı kullanın. İleti blokları ve ileti iletme işlevlerini paralel uygulamalar kilitleri gibi eşitleme mekanizmaları gerek kalmadan yazmanıza olanak sağlar. Bu uygulama mantığı üzerinde odaklanmanıza olanak sağlar.

Aracısı programlama modelini oluşturmak için kullanılır veri pipelines veya ağlar. Veri kanalı her biri büyük bir amaç için katkıda bulunan belirli bir görevi gerçekleştiren bileşenler dizisidir. Başka bir bileşenden bir ileti aldığında her bileşeni dataflow potansiyel iş yapar. Bu çalışma sonucunda diğer potansiyel veya ağ bileşenlerinde geçirilir. Bileşenleri daha fazla belirtilecek eşzamanlılık işlevselliği diğer kitaplıklardan örneğin kullanabilirsiniz, Paralel Desenler kitaplığının (ppl).

Örnek

Aşağıdaki örnekte, bu konuda gösterilen resimde uygular.

// basic-agents.cpp
// compile with: /EHsc
#include <agents.h>
#include <string>
#include <iostream>
#include <sstream>

using namespace concurrency;
using namespace std;

// This agent writes a string to its target and reads an integer
// from its source.
class agent1 : public agent 
{
public:
   explicit agent1(ISource<int>& source, ITarget<wstring>& target)
      : _source(source)
      , _target(target)
   {
   }

protected:
   void run()
   {
      // Send the request.
      wstringstream ss;
      ss << L"agent1: sending request..." << endl;
      wcout << ss.str();

      send(_target, wstring(L"request"));

      // Read the response.
      int response = receive(_source);

      ss = wstringstream();
      ss << L"agent1: received '" << response << L"'." << endl;
      wcout << ss.str();

      // Move the agent to the finished state.
      done();
   }

private:   
   ISource<int>& _source;
   ITarget<wstring>& _target;
};

// This agent reads a string to its source and then writes an integer
// to its target.
class agent2 : public agent 
{
public:
   explicit agent2(ISource<wstring>& source, ITarget<int>& target)
      : _source(source)
      , _target(target)
   {
   }

protected:
   void run()
   {
      // Read the request.
      wstring request = receive(_source);

      wstringstream ss;
      ss << L"agent2: received '" << request << L"'." << endl;
      wcout << ss.str();

      // Send the response.
      ss = wstringstream();
      ss << L"agent2: sending response..." << endl;
      wcout << ss.str();

      send(_target, 42);

      // Move the agent to the finished state.
      done();
   }

private:   
   ISource<wstring>& _source;
   ITarget<int>& _target;
};

int wmain()
{
   // Step 1: Create two message buffers to serve as communication channels
   // between the agents.

   // The first agent writes messages to this buffer; the second
   // agents reads messages from this buffer.
   unbounded_buffer<wstring> buffer1;

   // The first agent reads messages from this buffer; the second
   // agents writes messages to this buffer.
   overwrite_buffer<int> buffer2;

   // Step 2: Create the agents.
   agent1 first_agent(buffer2, buffer1);
   agent2 second_agent(buffer1, buffer2);

   // Step 3: Start the agents. The runtime calls the run method on
   // each agent.
   first_agent.start();
   second_agent.start();

   // Step 4: Wait for both agents to finish.
   agent::wait(&first_agent);
   agent::wait(&second_agent);
}

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

agent1: sending request...
agent2: received 'request'.
agent2: sending response...
agent1: received '42'.

Aşağıdaki konularda, bu örnekte kullanılan işlevleri açıklanmaktadır.

İlgili Konular