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 enthält das Fenster "Parallele Stapel" , "Parallele Aufgaben " und das Fenster "Parallele Überwachung ". Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Debuggen einer parallelen Anwendung und Vorgehensweise: Verwenden des Fensters "Parallele Überwachung".

Profilerstellung

Die Profilerstellungstools bieten drei Datenansichten, die grafische, tabellarische und numerische Informationen darüber anzeigen, wie eine Mehrthreadanwendung mit sich selbst und anderen Programmen interagiert. Mit den Ansichten können Sie bereiche von Belang schnell identifizieren und von Punkten auf den grafischen Displays zu Aufrufstapeln, Aufrufen von Websites und Quellcode navigieren. Weitere Informationen finden Sie unter Parallelitätsschnellansicht.

Ereignisablaufverfolgung

Die Parallelitäts-Runtime verwendet die Ereignisablaufverfolgung für Windows (ETW), um Instrumentierungstools wie Profiler zu benachrichtigen, wenn verschiedene Ereignisse auftreten. Diese Ereignisse umfassen, wenn ein Planer aktiviert oder deaktiviert wird, wenn ein Kontext beginnt, endet, Blöcke, Blockierungen oder Ergibt, und wenn ein paralleler Algorithmus beginnt oder endet.

Tools wie die Concurrency Visualizer nutzen diese Funktionalität. Daher müssen Sie in der Regel nicht direkt mit diesen Ereignissen arbeiten. Diese Ereignisse sind jedoch hilfreich, wenn Sie einen benutzerdefinierten Profiler entwickeln oder Ereignisablaufverfolgungstools wie das Windows Performance Toolkit verwenden.

Die Parallelitätslaufzeit löst diese Ereignisse nur aus, wenn die Ablaufverfolgung aktiviert ist. Rufen Sie die Parallelität::EnableTracing-Funktion auf, um die Ereignisablaufverfolgung und die Parallelität::D isableTracing-Funktion zum Deaktivieren der Ablaufverfolgung zu aktivieren.

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

Ereignis BESCHREIBUNG 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::P PLParallelForEventGuid Markiert den Eingang und den Ausgang für Aufrufe an die Parallelität::p arallel_for-Algorithmus . 31c8da6b-6165-4042-8b92-949e315f4d84
concurrency::P PLParallelForeachEventGuid Markiert den Eingang und den Ausgang für Aufrufe an die Parallelität::p arallel_for_each Algorithmus. 5cb7d785-9d66-465d-bae1-4611061b5434
concurrency::P PLParallelInvokeEventGuid Markiert den Eingang und den Ausgang für Aufrufe des Parallelitätsalgorithmus::p arallel_invoke . d1b5b133-ec3d-49f4-98a3-464d1a9e4682
concurrency::SchedulerEventGuid Markiert Ereignisse, die mit dem Vorgangszeitplaner zusammenhängen. e2091f8a-1e0a-4731-84a2-0dd57c8a5261
concurrency::VirtualProcessorEventGuid Markiert Ereignisse, die sich auf virtuelle Prozessoren beziehen. 2f27805f-1676-4ecc-96fa-7eb09d44302f

Die Parallelitätslaufzeit definiert, löst derzeit jedoch nicht die folgenden Ereignisse aus. Die Laufzeit reserviert diese Ereignisse für die zukünftige Verwendung:

Die Parallelität::ConcRT_EventType-Aufzählung gibt die möglichen Vorgänge an, die ein Ereignis nachverfolgt. Beispielsweise löst die Laufzeit am Eingang des parallel_for Algorithmus das PPLParallelForEventGuid Ereignis aus und stellt CONCRT_EVENT_START als Vorgang bereit. Bevor der parallel_for Algorithmus zurückgegeben wird, löst die Laufzeit das PPLParallelForEventGuid Ereignis erneut aus und stellt als Vorgang bereit CONCRT_EVENT_END .

Das folgende Beispiel veranschaulicht, wie die Ablaufverfolgung für einen Aufruf parallel_foraktiviert wird. Die Laufzeit verfolgt den ersten Aufruf parallel_for nicht, da die Ablaufverfolgung nicht aktiviert ist. Der Aufruf ermöglicht EnableTracing es der Laufzeit, den zweiten Aufruf nachzuverfolgen.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();
}

Die Laufzeit verfolgt die Anzahl der Aufrufe EnableTracing und DisableTracing. Wenn Sie also mehrmals anrufen EnableTracing , müssen Sie dieselbe Anzahl von Anrufen anrufen DisableTracing , um die Ablaufverfolgung zu deaktivieren.

Siehe auch

Concurrency Runtime