Partilhar via


Visão geral de tempo de execução de concorrência

Este documento fornece uma visão geral de tempo de execução de simultaneidade.Descrever os benefícios de tempo de execução de concorrência, quando e como usá-lo, seus componentes interagem entre si e com o sistema operacional e aplicativos.

Seções

Este documento contém as seções a seguir:

  • Porque o tempo de execução para concorrência é importante

  • Arquitetura

  • Expressões Lambda C++

  • Requisitos

Porque o tempo de execução para concorrência é importante

Um tempo de execução para concorrência fornece a uniformidade e a previsibilidade a aplicativos e para componentes do aplicativo simultaneamente executados.Dois exemplos dos benefícios de tempo de execução de simultaneidade são tarefa de programação cooperativa e bloqueio cooperativo.

O tempo de execução de simultaneidade usa um agendador de tarefa cooperativo que implementa um algoritmo de ser roubada para distribuir com o trabalho entre recursos de computação.Por exemplo, considere um aplicativo que possui dois segmentos que ambos são gerenciados no mesmo tempo de execução.Se um segmento termina sua tarefa agendada, pode offload o trabalho de outro segmento.Esse mecanismo equilibra a carga de trabalho total do aplicativo.

O tempo de execução de simultaneidade também fornece primitivos de sincronização que usam o bloqueio cooperativo para sincronizar acesso aos recursos.Por exemplo, considere uma tarefa que deve ter acesso exclusivo a um recurso compartilhado.Bloqueando cooperativa, o tempo de execução pode usar o quantum restante para executar outra tarefa como a primeira tarefa espera que o recurso.Esse mecanismo eleva o uso máximo de recursos de computação.

Superior[]

Arquitetura

O tempo de execução de concorrência é dividido em quatro componentes: a modelos paralela a biblioteca (PPL), a biblioteca de agentes assíncrono, o agendador de tarefas, e o Gerenciador de Recursos.Esses componentes estão entre o sistema operacional e aplicativos.A ilustração a seguir mostra como os componentes de tempo de execução de simultaneidade interagem entre o sistema operacional e aplicativos:

Arquitetura de tempo de execução de concorrência

A arquitetura de Runtime de simultaneidade

Observação importanteImportante

Os componentes de agendador e Gerenciador de Recursos de tarefa não estão disponíveis de um aplicativo de Windows Store .

O tempo de execução de concorrência é altamente passível de composição, ou seja, você pode combinar a funcionalidade existente para tornar mais.O tempo de execução de simultaneidade composto muitos recursos, como algoritmos paralelos, componentes de baixo nível.

O tempo de execução de simultaneidade também fornece primitivos de sincronização que usam o bloqueio cooperativo para sincronizar acesso aos recursos.Para obter mais informações sobre esses primitivos de sincronização, consulte Estruturas de dados de sincronização.

As seções a seguir fornecem uma visão geral de que cada componente e fornece do quando usar.

Ee207192.collapse_all(pt-br,VS.110).gifParalela à biblioteca modelos

A biblioteca (PPL) dos padrões de paralela fornece recipiente e algoritmos comumente usados para executar o paralelismo mais aguçado.O PPL permite que o paralelismo obrigatório de dados fornecendo os algoritmos paralelos que de distribuir ou cálculos em coleções em conjuntos de dados através dos recursos de computação.Também permite o paralelismo de tarefa fornecendo os objetos task que de distribuir independentes de várias operações pelos recursos de computação.

Use a biblioteca dos padrões de paralela quando você tiver uma computação local que pode se beneficiar de execução paralela.Por exemplo, você pode usar o algoritmo de concurrency::parallel_for para transformar um loop existente de for para atuar paralelamente.

Para obter mais informações sobre a biblioteca dos padrões de paralela, consulte A modelos paralela a biblioteca (PPL).

Ee207192.collapse_all(pt-br,VS.110).gifBiblioteca de agentes assíncrono

A biblioteca assíncrona de agentes (ou apenas a biblioteca de agentes) fornecem um modelo ator- base e a mensagem de programação que passam interfaces para o fluxo de dados de alta granularidade e que canalizam tarefas.Agentes assíncronos permitem que você fazer uso produtivo de latência executando o trabalho com outros componentes esperam dados.

Use a biblioteca de agentes quando você tem várias entidades que se comunicam entre si de forma assíncrona.Por exemplo, você pode criar um agente que lê dados de um arquivo ou uma conexão de rede e use a mensagem que passa interfaces para enviar os dados para outro agente.

Para obter mais informações sobre a biblioteca de agentes, consulte Biblioteca de agentes assíncrono.

Ee207192.collapse_all(pt-br,VS.110).gifAgendador de tarefas

O agendador de tarefa agenda e coordena tarefas em tempo de execução.O agendador de tarefa é cooperativo e usa um algoritmo de ser roubada para obter o uso máximo de recursos de processamento.

O tempo de execução de simultaneidade fornece um agendador padrão para que você não tenha que gerenciar infraestrutura de detalhes.No entanto, para atender às necessidades de qualidade do seu aplicativo, você também pode fornecer sua própria diretiva de programação ou associar agendadores específicos com as tarefas específicas.

Para obter mais informações sobre o agendador de tarefas, consulte Agendador de tarefa (tempo de execução de simultaneidade).

Ee207192.collapse_all(pt-br,VS.110).gifO Gerenciador de Recursos

A função do Gerenciador de Recursos é gerenciar recursos de computação, como processadores e memória.O Gerenciador de Recursos responde a carrega de trabalho com mudam em tempo de execução atribuindo os recursos para onde podem ser o mais vigor.

O Gerenciador de Recursos serve como uma abstração sobre recursos de computação e interage com o primeiro agendador de tarefas.Embora você possa usar o Gerenciador de Recursos para ajustar o desempenho de seus aplicativos e bibliotecas, você normalmente usa a funcionalidade que é fornecida pela biblioteca dos padrões de paralela, a biblioteca de agentes, e o agendador de tarefas.Essas bibliotecas usando o Gerenciador de Recursos para rebalance dinamicamente recursos como carrega de trabalho são alterados.

Superior[]

Expressões Lambda C++

Muitos dos tipos e os algoritmos que são definidos no tempo de execução de simultaneidade são implementados como modelos C++.Alguns desses tipos e os algoritmos recebem como um parâmetro uma rotina que executa o trabalho.Este parâmetro pode ser uma função lambda, um objeto de função, ou um ponteiro de função.Essas entidades são também conhecido como funções de trabalho ou rotinas de trabalho.

Expressões Lambda é um novo recurso importante de linguagem do Visual C++ pois fornecem uma maneira de definir sucinto funções de trabalho para processamento paralelo.Os objetos de função e ponteiros de função permite que você use o tempo de execução de simultaneidade com o código existente.No entanto, é recomendável usar expressões lambda quando você escreve um novo código por causa dos benefícios de segurança e de produtividade que fornecem.

O exemplo a seguir compara a sintaxe de funções lambda, objetos de função, e de ponteiros de função em chamadas de várias ao algoritmo de concurrency::parallel_for_each .Cada chamada a parallel_for_each usa uma técnica diferente calcular o quadrado de cada elemento em um objeto de std::array .

// comparing-work-functions.cpp
// compile with: /EHsc
#include <ppl.h>
#include <array>
#include <iostream>

using namespace concurrency;
using namespace std;

// Function object (functor) class that computes the square of its input.
template<class Ty>
class SquareFunctor
{
public:
   void operator()(Ty& n) const
   {
      n *= n;
   }
};

// Function that computes the square of its input.
template<class Ty>
void square_function(Ty& n)
{
   n *= n;
}

int wmain()
{
   // Create an array object that contains 5 values.
   array<int, 5> values = { 1, 2, 3, 4, 5 };

   // Use a lambda function, a function object, and a function pointer to 
   // compute the square of each element of the array in parallel.

   // Use a lambda function to square each element.
   parallel_for_each(begin(values), end(values), [](int& n){n *= n;});

   // Use a function object (functor) to square each element.
   parallel_for_each(begin(values), end(values), SquareFunctor<int>());

   // Use a function pointer to square each element.
   parallel_for_each(begin(values), end(values), &square_function<int>);

   // Print each element of the array to the console.
   for_each(begin(values), end(values), [](int& n) { 
      wcout << n << endl;
   });
}

Saída

  

Para obter mais informações sobre funções lambda em C++, consulte Expressões lambda C++.

Superior[]

Requisitos

A tabela a seguir mostra os arquivos de cabeçalho que são associados a cada componente em tempo de execução de concorrência:

Componente

Arquivos de cabeçalho

A modelos paralela a biblioteca (PPL)

ppl.h

concurrent_queue.h

concurrent_vector.h

Biblioteca de agentes assíncrono

agents.h

Agendador de tarefas

concrt.h

O Gerenciador de Recursos

concrtrm.h

O tempo de execução de concorrência é declarado no namespace de Concorrência .(Você também pode usar concorrência, que é um alias para este namespace.) O namespace de concurrency::details oferece suporte a estrutura de tempo de execução de concorrência, e não se destina a ser usada diretamente do seu código.

O tempo de execução de concorrência é fornecido como parte da biblioteca em tempo de execução de CRT C ().Para obter mais informações sobre como criar um aplicativo que usa o CRT, consulte Recursos da biblioteca CRT.

Superior[]