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 |
---|---|---|
Der ETW-Anbieterbezeichner für die Concurrency Runtime. |
f7b697a3-4db5-4d3b-be71-c4d284e6592f |
|
Markiert Ereignisse, die sich auf Kontexte beziehen. |
5727a00f-50be-4519-8256-f7699871fecb |
|
Markiert den Beginn und das Ende von Aufrufen des - Algorithmus concurrency::parallel_for. |
31c8da6b-6165-4042-8b92-949e315f4d84 |
|
Markiert den Beginn und das Ende von Aufrufen des - Algorithmus concurrency::parallel_for_each. |
5cb7d785-9d66-465d-bae1-4611061b5434 |
|
Markiert den Beginn und das Ende von Aufrufen des - Algorithmus concurrency::parallel_invoke. |
d1b5b133-ec3d-49f4-98a3-464d1a9e4682 |
|
Markiert Ereignisse, die sich auf den Taskplaner beziehen. |
e2091f8a-1e0a-4731-84a2-0dd57c8a5261 |
|
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.