Freigeben über


Diagnosetools für die parallele Ausführung (Concurrency Runtime)

Visual Studio bietet umfangreiche Unterstützung für das Debuggen und die Profilerstellung in Multithreadanwendungen.

Debuggen

Der Visual Studio-Debugger beinhaltet das Fenster Parallele Stapel, Fenster Parallele Aufgaben und Fenster Parallele Überwachung.Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Debuggen einer parallelen Anwendung und Gewusst wie: Verwenden des parallelen Überwachungsfensters.

Profilerstellung

In den Profilerstellungstools drei Datenansichten, die die grafische, tabellarische und numerische Informationen darüber angezeigt werden, wie eine Multithreadanwendung mit sich und mit anderen Programmen interagiert.In den Ansichten können Sie schnell problematische Bereiche erkennen und von Punkten in den grafischen Anzeigen zu Aufruflisten, Aufrufsites und Quellcode navigieren.Weitere Informationen finden Sie unter Parallelitätsschnellansicht.

Ereignisablaufverfolgung

Die Concurrency Runtime verwendet die Ereignisablaufverfolgung für Windows (Event Tracing for Windows, ETW), um Instrumentationstools, z. B. Profiler, über Ereignisse zu benachrichtigen.Zu diesen Ereignissen zählen z. B. das Aktivieren oder Deaktivieren eines Planers, das Starten, Beenden, Blockieren, Aufheben der Blockierung oder Zurückhalten eines Kontexts und das Starten oder Beenden eines parallelen Algorithmus.

Diese Funktionalität wird von Tools wie dem Parallelitätsschnellansicht genutzt. Deshalb müssen Sie normalerweise nicht direkt mit diesen Ereignissen arbeiten.Diese Ereignisse sind jedoch hilfreich, wenn Sie einen benutzerdefinierten Profiler entwickeln oder wenn Sie Ereignisablaufverfolgungstools, z. B. Xperf, verwenden.

Die Concurrency Runtime löst diese Ereignisse nur aus, wenn die Ablaufverfolgung aktiviert ist.Rufen Sie die Concurrency::EnableTracing-Funktion auf, um die Ereignisablaufverfolgung und die Concurrency::DisableTracing-Funktion aktivieren, um sie zu deaktivieren.

In der folgenden Tabelle werden die Ereignisse beschrieben, die von der Laufzeit ausgelöst werden, wenn die Ereignisablaufverfolgung aktiviert ist:

Ereignis

Description

Wert

concurrency::ConcRT_ProviderGuid

Der ETW-Anbieterbezeichner für die Concurrency Runtime.

f7b697a3-4db5-4d3b-be71-c4d284e6592f

concurrency::ContextEventGuid

Markiert Ereignisse, die sich auf Kontexte beziehen.

5727a00f-50be-4519-8256-f7699871fecb

concurrency::PPLParallelForEventGuid

Markiert den Beginn und das Ende von Aufrufen des - Algorithmus concurrency::parallel_for.

31c8da6b-6165-4042-8b92-949e315f4d84

concurrency::PPLParallelForeachEventGuid

Markiert den Beginn und das Ende von Aufrufen des - Algorithmus concurrency::parallel_for_each.

5cb7d785-9d66-465d-bae1-4611061b5434

concurrency::PPLParallelInvokeEventGuid

Markiert den Beginn und das Ende von Aufrufen des - Algorithmus concurrency::parallel_invoke.

d1b5b133-ec3d-49f4-98a3-464d1a9e4682

concurrency::SchedulerEventGuid

Markiert Ereignisse, die sich auf den Taskplaner beziehen.

e2091f8a-1e0a-4731-84a2-0dd57c8a5261

concurrency::VirtualProcessorEventGuid

Markiert Ereignisse, die sich auf virtuelle Prozessoren beziehen.

2f27805f-1676-4ecc-96fa-7eb09d44302f

Die Concurrency Runtime definiert die folgenden Ereignisse, löst sie derzeit jedoch nicht aus.Die folgenden Ereignisse sind für die zukünftige Verwendung durch die Laufzeit reserviert:

Die concurrency::ConcRT_EventType-Enumeration gibt die möglichen Vorgänge an, die ein Ereignis nachverfolgt.Beispielsweise löst die Laufzeit bei Beginn des parallel_for-Algorithmus das PPLParallelForEventGuid -Ereignis aus und stellt CONCRT_EVENT_START als Vorgang bereit.Bevor der parallel_for-Algorithmus beendet wird, löst die Laufzeit erneut das PPLParallelForEventGuid-Ereignis aus und stellt CONCRT_EVENT_END als Vorgang bereit.

Das folgende Beispiel veranschaulicht, wie die Ablaufverfolgung für einen Aufruf von parallel_for aktiviert wird.Die Laufzeit verfolgt den ersten Aufruf von parallel_for nicht nach, da keine Ablaufverfolgung aktiviert ist.Der Aufruf von EnableTracing aktiviert die Ablaufverfolgung des zweiten Aufrufs von parallel_for durch die Laufzeit.

// 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();
}

Die Laufzeit verfolgt die Anzahl der Aufrufe von EnableTracing und DisableTracing nach.Daher müssen Sie zum Deaktivieren der Ablaufverfolgung DisableTracing so oft aufrufen, wie Sie EnableTracing aufrufen.

Siehe auch

Konzepte

Concurrency Runtime