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_for
aktiviert 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.