Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Visual Studio fornece suporte extensivo para depuração e criação de perfil de aplicativos multi-threaded.
Depuração de código
O depurador do Visual Studio inclui a janela Pilhas paralelas , a janela Tarefas paralelas e a janela Observação paralela . Para obter mais informações, consulte Guia passo a passo: Depuração de uma aplicação paralela e Como utilizar a janela de observação paralela.
Perfilagem
As ferramentas de criação de perfil fornecem três exibições de dados que exibem informações gráficas, tabulares e numéricas sobre como um aplicativo multi-threaded interage consigo mesmo e com outros programas. As visualizações permitem-lhe identificar rapidamente áreas de preocupação e navegar desde pontos nos monitores gráficos até pilhas de chamadas, locais de chamadas e código-fonte. Para mais informações, consulte Visualizador de Concorrência.
Rastreamento de eventos
O Tempo de Execução de Simultaneidade usa o Rastreamento de Eventos para Windows (ETW) para notificar ferramentas de instrumentação, como criadores de perfil, quando vários eventos ocorrem. Esses eventos incluem quando um agendador é ativado ou desativado, quando um contexto começa, termina, bloqueia, desbloqueia ou produz e quando um algoritmo paralelo começa ou termina.
Ferramentas como o Visualizador de Simultaneidade utilizam essa funcionalidade; portanto, normalmente não é necessário trabalhar diretamente com esses eventos. No entanto, esses eventos são úteis quando você está desenvolvendo um criador de perfil personalizado ou quando usa ferramentas de rastreamento de eventos, como o Kit de Ferramentas de Desempenho do Windows.
O Concurrency Runtime gera esses eventos somente quando o rastreamento está habilitado. Chame a função concurrency::EnableTracing para habilitar o rastreamento de eventos e a função concurrency::D isableTracing para desabilitar o rastreamento.
A tabela a seguir descreve os eventos que o tempo de execução gera quando o rastreamento de eventos está habilitado:
| Evento | Descrição | Valor |
|---|---|---|
| simultaneidade::ConcRT_ProviderGuid | O identificador do provedor ETW para o Concurrency Runtime. | f7b697a3-4db5-4d3b-be71-c4d284e6592f |
| concorrência::ContextEventGuid | Marca eventos relacionados a contextos. | 5727a00f-50be-4519-8256-f7699871fecb |
| simultaneidade::P PLParallelForEventGuid | Marca a entrada e saída de chamadas para o algoritmo concurrency::parallel_for. | 31c8da6b-6165-4042-8b92-949e315f4d84 |
| simultaneidade::PPLParallelForeachEventGuid | Marca a entrada e saída de chamadas para o algoritmo concurrency::parallel_for_each. | 5cb7d785-9d66-465d-bae1-4611061b5434 |
| simultaneidade::P PLParallelInvokeEventGuid | Marca a entrada e saída de chamadas para o algoritmo concurrency::parallel_invoke. | d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
| concorrência::SchedulerEventGuid | Marca eventos relacionados ao Agendador de Tarefas. | e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
| concorrência::VirtualProcessorEventGuid | Marca eventos relacionados a processadores virtuais. | 2f27805f-1676-4ecc-96fa-7eb09d44302f |
O Concurrency Runtime define, mas não gera atualmente, os seguintes eventos. O tempo de execução reserva estes eventos para uso futuro:
A enumeração concurrency::ConcRT_EventType especifica as operações possíveis que um evento rastreia. Por exemplo, na entrada do algoritmo, o tempo de execução parallel_for gera o evento PPLParallelForEventGuid e fornece CONCRT_EVENT_START como a operação. Antes que o parallel_for algoritmo retorne, o tempo de execução novamente gera o PPLParallelForEventGuid evento e fornece CONCRT_EVENT_END como a operação.
O exemplo a seguir ilustra como habilitar o rastreamento de uma chamada para parallel_for. O tempo de execução não rastreia a primeira chamada para parallel_for porque o rastreamento não está habilitado. A chamada para EnableTracing permite que o tempo de execução rastreie a segunda chamada para parallel_for.
// etw.cpp
// compile with: /EHsc
#include <ppl.h>
using namespace concurrency;
int wmain()
{
// Perform some parallel work.
// Event tracing is disabled at this point.
parallel_for(0, 10000, [](int i) {
// TODO: Perform work.
});
// Enable tracing for a second call to parallel_for.
EnableTracing();
parallel_for(0, 10000, [](int i) {
// TODO: Perform work.
});
DisableTracing();
}
O tempo de execução controla o número de vezes que você chama EnableTracing e DisableTracing. Portanto, se você ligar EnableTracing várias vezes, você deve ligar DisableTracing o mesmo número de vezes para desativar o rastreamento.