concurrency-Namespace-Funktionen
Alloc
asend
cancel_current_task
clear
create_async
create_task
CreateResourceManager
DisableTracing
EnableTracing
Free
get_ambient_scheduler
GetExecutionContextId
GetOSVersion
GetProcessorCount
GetProcessorNodeCount
Alloc
Reserviert einen Speicherblock mit der in der Unterbelegungsfunktion für die Zwischenspeicherung der Concurrency Runtime angegebenen Größe.
void* __cdecl Alloc(size_t _NumBytes);
Parameter
_NumBytes
Die Anzahl der zuzuweisenden Bytes des Arbeitsspeichers.
Rückgabewert
Ein Zeiger auf neu zugewiesenen Speicher.
Hinweise
Weitere Informationen dazu, welche Szenarien in Ihrer Anwendung von der Verwendung des Zwischenspeichern-Unterspeicherns profitieren könnten, finden Sie unter Task Scheduler.
asend
Ein asynchroner Sendevorgang, der eine Aufgabe zum Weitergeben der Daten an den Zielblock plant.
template <class T>
bool asend(
_Inout_ ITarget<T>* _Trg,
const T& _Data);
template <class T>
bool asend(
ITarget<T>& _Trg,
const T& _Data);
Parameter
T
Der Typ der zu sendenden Daten.
_Trg
Ein Zeiger oder Ein Verweis auf das Ziel, an das Daten gesendet werden.
_Daten
Ein Verweis auf die zu sendenden Daten.
Rückgabewert
true
wenn die Nachricht vor der Rückgabe der Methode akzeptiert wurde, false
andernfalls.
Hinweise
Weitere Informationen finden Sie unter Message Passing Functions.
cancel_current_task
Bricht die gerade ausgeführte Aufgabe ab. Diese Funktion kann aus dem Text einer Aufgabe aufgerufen werden, um die Ausführung der Aufgabe abzubrechen und ihn dabei in den canceled
Zustand übergehen zu lassen.
Der Aufruf dieser Funktion, wenn Sie sich nicht innerhalb des Texts von einem task
befinden, ist kein unterstütztes Szenario. Dies führt zu einem nicht definierten Verhalten, z. B. zu einem Absturz oder zu nicht reagierender Reaktion in Ihrer Anwendung.
inline __declspec(noreturn) void __cdecl cancel_current_task();
clear
Löscht die gleichzeitige Warteschlange und zerstört alle derzeit enqueuierten Elemente. Diese Methode ist nicht nebenläufigkeitssicher.
template<typename T, class _Ax>
void concurrent_queue<T, _Ax>::clear();
Parameter
T
_Axt
create_async
Erstellt ein asynchrones Konstrukt der Windows Runtime auf einem vom Benutzer angegebenes Lambda oder Funktionsobjekt. Der Rückgabetyp von create_async
ist entweder IAsyncAction^
, IAsyncActionWithProgress<TProgress>^
, IAsyncOperation<TResult>^
oder IAsyncOperationWithProgress<TResult, TProgress>^
auf Grundlage der Signatur des Lambda-Ausdrucks, der an die Methode übergeben wurde.
template<typename _Function>
__declspec(noinline) auto create_async(const _Function& _Func)
-> decltype(ref new details::_AsyncTaskGeneratorThunk<_Function>(_Func));
Parameter
_Funktion
Typ:
_Func
Der Lambda-Ausdruck oder das Funktionsobjekt, aus dem ein asynchrones Windows-Runtime-Konstrukt erstellt werden soll.
Rückgabewert
Ein asynchrones Konstrukt, dargestellt durch ein IAsyncAction^, IAsyncActionWithProgress<TProgress>^, IAsyncOperation<TResult>^, oder ein IAsyncOperationWithProgress<TResult, TProgress>^. Die Schnittstelle, die zurückgegeben wird, hängt von der Signatur des Lambda-Ausdrucks ab, der an die Funktion übergeben wird.
Hinweise
Der Rückgabetyp des Lambdaausdrucks bestimmt, ob das Konstrukt eine Aktion oder ein Vorgang ist.
Lambda-Ausdrücke, die "void" zurückgeben, führen zur Erstellung von Aktionen. Lambda-Ausdrücke, die ein Ergebnis vom Typ TResult
zurückgeben, führen zur Erstellung von TResult-Vorgängen.
Der Lambda-Ausdruck kann auch task<TResult>
zurückgeben, was die asynchronen Abläufe kapselt, oder die Fortsetzung einer Kette von Aufgaben ist, die die asynchronen Abläufe darstellen. In diesem Fall wird der Lambda-Ausdruck selbst inline ausgeführt, da die Aufgaben asynchron ausgeführt werden, und der Rückgabetyp des Lambda-Ausdrucks wird entpackt, um das von create_async
zurückgegebene asynchrone Konstrukt zu erstellen. Dies bedeutet, dass eine Lambda-Funktion, die eine Aufgabe<zurückgibt> , die Erstellung von Aktionen verursacht, und eine Lambda-Funktion, die ein Aufgaben-TResult<zurückgibt, die Erstellung von Vorgängen von TResult> verursacht.
Der Lambda-Ausdruck akzeptiert null, ein oder zwei Argumente. Die gültigen Argumente sind progress_reporter<TProgress>
und cancellation_token
in dieser Reihenfolge, wenn beide verwendet werden. Ein Lambda-Ausdruck ohne Argumente bewirkt die Erstellung eines asynchronen Konstrukts ohne die Möglichkeit der Statusberichterstellung. Eine Lambda-Funktion, die einen progress_reporter<TProgress> akzeptiert, führt create_async
dazu, dass ein asynchrones Konstrukt zurückgegeben wird, das den Fortschritt des Typs "TProgress" jedes Mal meldet, wenn die report
Methode des progress_reporter Objekts aufgerufen wird. Ein Lambda-Ausdruck, der ein „cancellation_token“ verwendet, kann dieses Token verwenden, um auf einen Abbruch zu prüfen, oder es an Aufgaben übergeben, die er erstellt, sodass ein Abbruch des asynchronen Konstrukts den Abbruch dieser Aufgaben verursacht.
Wenn der Textkörper des Lambda- oder Funktionsobjekts ein Ergebnis (und nicht ein Aufgaben-TResult<>) zurückgibt, wird die Lamdba im Kontext einer Aufgabe, die von der Runtime implizit für sie erstellt wird, asynchron innerhalb des Prozesses MTA ausgeführt. Die IAsyncInfo::Cancel
-Methode verursacht den Abbruch der impliziten Aufgabe.
Wenn der Text des Lambda-Ausdrucks eine Aufgabe zurückgibt, wird der Lambda-Ausdruck inline ausgeführt. Durch Deklarieren des Lambda-Ausdrucks zur Verwendung eines Arguments des Typs cancellation_token
können Sie den Abbruch aller Aufgaben auslösen, die Sie innerhalb des Lambda-Ausdrucks erstellen, indem Sie dieses Token bei ihrer Erstellung übergeben. Sie können auch die register_callback
-Methode im Token verwenden, um die Laufzeit zu veranlassen, einen Rückruf aufzurufen, wenn Sie IAsyncInfo::Cancel
für den asynchronen Vorgang oder die verursachte Aktion aufrufen.
Diese Funktion ist nur für Windows-Runtime Apps verfügbar.
CreateResourceManager
Gibt eine Schnittstelle zurück, die die Singletoninstanz des Ressourcen-Managers der Concurrency Runtime darstellt. Der Ressourcen-Manager ist für das Zuweisen von Ressourcen für Planer, die miteinander kooperieren möchten, zuständig.
IResourceManager* __cdecl CreateResourceManager();
Rückgabewert
Eine IResourceManager
-Schnittstelle.
Hinweise
Mehrere nachfolgende Aufrufe dieser Methode geben die gleiche Instanz des Ressourcen-Managers zurück. Jeder Aufruf der Methode erhöht eine Verweisanzahl für den Ressourcen-Manager und muss mit einem Aufruf der IResourceManager::Release-Methode abgeglichen werden, wenn der Zeitplan mit dem Ressourcen-Manager kommuniziert.
unsupported_os wird ausgelöst, wenn das Betriebssystem von der Parallelitäts-Runtime nicht unterstützt wird.
create_task
Erstellt ein PPL-Aufgabenobjekt. Das Element create_task
kann überall dort verwendet werden, wo Sie einen Aufgabenkonstruktor verwendet hätten. Es wird hauptsächlich der Einfachheit halber bereitgestellt, da es beim Erstellen eines Tasks die Verwendung des auto
-Schlüsselwort ermöglicht.
template<typename T>
__declspec(noinline) auto create_task(T _Param, const task_options& _TaskOptions = task_options())
-> task<typename details::_TaskTypeFromParam<T>::T>;
template<typename _ReturnType>
__declspec( noinline) task<_ReturnType> create_task(const task<_ReturnType>& _Task);
Parameter
T
Der Typ des Parameters, von dem die Aufgabe erstellt werden soll.
_ReturnType
Typ:
_Param
Der Parameter, von dem der Task erstellt werden soll. Dies kann ein Lambda- oder Funktionsobjekt, ein task_completion_event
Objekt, ein anderes task
Objekt oder eine Windows::Foundation::IAsyncInfo-Schnittstelle sein, wenn Sie Aufgaben in Ihrer UWP-App verwenden.
_TaskOptions
Die Vorgangsoptionen.
_Aufgabe
Der zu erstellende Task.
Rückgabewert
Eine neue Aufgabe des Typs T
, der von _Param
abgeleitet wird.
Hinweise
Die erste Überladung verhält sich wie ein Aufgabenkonstruktor, der einen einzelnen Parameter akzeptiert.
Die zweite Überladung weist das Abbruchtoken, das der neu erstellten Aufgabe bereitgestellt wird, zu. Wenn Sie diese Überladung verwenden, ist die Übergabe eines anderen task
-Objekts als erster Parameter nicht zulässig.
Der Typ des zurückgegebenen Tasks wird vom ersten Parameter zur Funktion abgeleitet. Wenn _Param
ein task_completion_event<T>
, ein task<T>
oder ein Funktionselement ist, das entweder den Typ T
oder task<T>
zurückgibt, ist der Typ des erstellten Tasks task<T>
.
Wenn es sich in einer UWP-App _Param
um den Typ "Windows::Foundation::IAsyncOperation<T>^" oder "Windows::Foundation::IAsyncOperationWithProgress<T,P>^" oder einen Functor handelt, der einen dieser Typen zurückgibt, ist die erstellte Aufgabe vom Typ .task<T>
Ist _Param
der Typ Windows::Foundation::IAsyncAction^ oder Windows::Foundation::IAsyncActionWithProgress<P>^, oder ein Functor, der einen dieser Typen zurückgibt, weist die erstellte Aufgabe den Typ auf task<void>
.
DisableTracing
Deaktiviert die Ablaufverfolgung in der Concurrency Runtime. Diese Funktion ist veraltet, da die Registrierung der ETW-Ablaufverfolgung standardmäßig aufgehoben wird.
__declspec(deprecated("Concurrency::DisableTracing is a deprecated function.")) _CRTIMP HRESULT __cdecl DisableTracing();
Rückgabewert
Wenn die Ablaufverfolgung ordnungsgemäß deaktiviert wurde, S_OK
wird sie zurückgegeben. Wenn die Ablaufverfolgung noch nicht initiiert wurde, E_NOT_STARTED
wird sie zurückgegeben.
EnableTracing
Aktiviert die Ablaufverfolgung in der Concurrency Runtime. Diese Funktion ist veraltet, da die Registrierung der ETW-Ablaufverfolgung jetzt standardmäßig erfolgt.
__declspec(deprecated("Concurrency::EnableTracing is a deprecated function.")) _CRTIMP HRESULT __cdecl EnableTracing();
Rückgabewert
Wenn die Ablaufverfolgung ordnungsgemäß initiiert wurde, S_OK
wird sie zurückgegeben. Andernfalls E_NOT_STARTED
wird die Ablaufverfolgung zurückgegeben.
Kostenlos
Gibt einen Speicherblock frei, der zuvor mit der Alloc
-Methode der Unterbelegungsfunktion für die Zwischenspeicherung der Concurrency Runtime reserviert wurde.
void __cdecl Free(_Pre_maybenull_ _Post_invalid_ void* _PAllocation);
Parameter
_PAllocation
Ein Zeiger auf den Arbeitsspeicher, der zuvor mit der Alloc
-Methode reserviert wurde und jetzt freigegeben werden soll. Wenn der _PAllocation
-Parameter auf den Wert NULL
festgelegt wurde, ignoriert diese Methode den Parameter und kehrt sofort zurück.
Hinweise
Weitere Informationen dazu, welche Szenarien in Ihrer Anwendung von der Verwendung des Zwischenspeichern-Unterspeicherns profitieren könnten, finden Sie unter Task Scheduler.
get_ambient_scheduler
inline std::shared_ptr<::Concurrency::scheduler_interface> get_ambient_scheduler();
Rückgabewert
GetExecutionContextId
Gibt einen eindeutigen Bezeichner zurück, der einem Ausführungskontext zugewiesen werden kann, der die IExecutionContext
-Schnittstelle implementiert.
unsigned int __cdecl GetExecutionContextId();
Rückgabewert
Ein eindeutiger Bezeichner für einen Ausführungskontext.
Hinweise
Verwenden Sie diese Methode, um einen Bezeichner für Den Ausführungskontext abzurufen, bevor Sie eine IExecutionContext
Schnittstelle als Parameter an eine der methoden übergeben, die vom Ressourcen-Manager angeboten werden.
GetOSVersion
Gibt die Betriebssystemversion zurück.
IResourceManager::OSVersion __cdecl GetOSVersion();
Rückgabewert
Ein Enumerationswert, der das Betriebssystem darstellt.
Hinweise
unsupported_os wird ausgelöst, wenn das Betriebssystem von der Parallelitäts-Runtime nicht unterstützt wird.
GetProcessorCount
Gibt die Anzahl von Hardwarethreads des zugrunde liegenden Systems zurück.
unsigned int __cdecl GetProcessorCount();
Rückgabewert
Die Anzahl der Hardwarethreads.
Hinweise
unsupported_os wird ausgelöst, wenn das Betriebssystem von der Parallelitäts-Runtime nicht unterstützt wird.
GetProcessorNodeCount
Gibt die Anzahl von NUMA-Knoten oder Prozessorpaketen des zugrunde liegenden Systems zurück.
unsigned int __cdecl GetProcessorNodeCount();
Rückgabewert
Die Anzahl von NUMA-Knoten oder Prozessorpaketen.
Hinweise
Wenn das System mehr NUMA-Knoten als Prozessorpakete enthält, wird die Anzahl der NUMA-Knoten zurückgegeben. Andernfalls wird die Anzahl der Prozessorpakete zurückgegeben.
unsupported_os wird ausgelöst, wenn das Betriebssystem von der Parallelitäts-Runtime nicht unterstützt wird.
GetSchedulerId
Gibt einen eindeutigen Bezeichner zurück, der einem Planer zugewiesen werden kann, der die IScheduler
-Schnittstelle implementiert.
unsigned int __cdecl GetSchedulerId();
Rückgabewert
Ein eindeutiger Bezeichner für einen Scheduler.
Hinweise
Verwenden Sie diese Methode, um einen Bezeichner für Den Zeitplan abzurufen, bevor Sie eine IScheduler
Schnittstelle als Parameter an eine der methoden übergeben, die vom Ressourcen-Manager angeboten werden.
internal_assign_iterators
template<typename T, class _Ax>
template<class _I>
void concurrent_vector<T, _Ax>::internal_assign_iterators(
_I first,
_I last);
Parameter
T
_Axt
_I
first
last
interruption_point
Erstellt einen Unterbrechungspunkt für den Abbruch. Wenn ein Abbruch im Kontext, in dem diese Funktion aufgerufen wird, ausgeführt wird, löst diese eine interne Ausnahme aus, mit der die Ausführung der aktuell ausgeführten parallelen Verarbeitung abgebrochen wird. Wenn kein Abbruch ausgeführt wird, bleibt die Funktion untätig.
inline void interruption_point();
Hinweise
Sie sollten die interne Abbruch exception, die von der interruption_point()
Funktion ausgelöst wird, nicht abfangen. Die Ausnahme wird von der Laufzeit abgefangen und behandelt, und das Abfangen kann dazu führen, dass sich Ihr Programm ungewöhnlich verhält.
is_current_task_group_canceling
Gibt zurück, ob die Aufgabengruppe, die gerade inline auf dem aktuellen Kontext ausgeführt wird, in diesem Moment (oder in Kürze) einen Abbruch durchführt. Beachten Sie, dass false
zurückgegeben wird, wenn auf dem aktuellen Kontext zurzeit inline keine Aufgabengruppe ausgeführt wird.
bool __cdecl is_current_task_group_canceling();
Rückgabewert
true
wenn die derzeit ausgeführte Aufgabengruppe abbricht, false
andernfalls.
Hinweise
Weitere Informationen finden Sie unter "Stornierung".
make_choice
Erstellt einen choice
-Meldungsblock aus einem optionalen Scheduler
oder einer ScheduleGroup
und mindestens zwei Eingabequellen.
template<typename T1, typename T2, typename... Ts>
choice<std::tuple<T1, T2, Ts...>> make_choice(
Scheduler& _PScheduler,
T1 _Item1,
T2 _Item2,
Ts... _Items);
template<typename T1, typename T2, typename... Ts>
choice<std::tuple<T1, T2, Ts...>> make_choice(
ScheduleGroup& _PScheduleGroup,
T1 _Item1,
T2 _Item2,
Ts... _Items);
template<typename T1, typename T2, typename... Ts>
choice<std::tuple<T1, T2, Ts...>> make_choice(
T1 _Item1,
T2 _Item2,
Ts... _Items);
Parameter
T1
Der Meldungsblocktyp der ersten Quelle.
T2
Der Meldungsblocktyp der zweiten Quelle.
_PScheduler
Das Scheduler
-Objekt, in dem die Weiterleitungsaufgabe für den choice
-Meldungsblock geplant ist.
_Item1
Die erste Quelle.
_Item2
Die zweite Quelle.
_Artikel
Zusätzliche Quellen.
_PScheduleGroup
Das ScheduleGroup
-Objekt, in dem die Weiterleitungsaufgabe für den choice
-Meldungsblock geplant ist. Das verwendete Scheduler
-Objekt wird von der Planungsgruppe impliziert.
Rückgabewert
Ein choice
-Nachrichtenblock mit zwei oder mehr Eingabequellen.
make_greedy_join
Erstellt einen greedy multitype_join
-Meldungsblock aus einem optionalen Scheduler
oder einer ScheduleGroup
und mindestens zwei Eingabequellen.
template<typename T1, typename T2, typename... Ts>
multitype_join<std::tuple<T1, T2, Ts...>,greedy> make_greedy_join(
Scheduler& _PScheduler,
T1 _Item1,
T2 _Item2,
Ts... _Items);
template<typename T1, typename T2, typename... Ts>
multitype_join<std::tuple<T1, T2, Ts...>, greedy> make_greedy_join(
ScheduleGroup& _PScheduleGroup,
T1 _Item1,
T2 _Item2,
Ts... _Items);
template<typename T1, typename T2, typename... Ts>
multitype_join<std::tuple<T1, T2, Ts...>, greedy> make_greedy_join(
T1 _Item1,
T2 _Items,
Ts... _Items);
Parameter
T1
Der Meldungsblocktyp der ersten Quelle.
T2
Der Meldungsblocktyp der zweiten Quelle.
_PScheduler
Das Scheduler
-Objekt, in dem die Weiterleitungsaufgabe für den multitype_join
-Meldungsblock geplant ist.
_Item1
Die erste Quelle.
_Item2
Die zweite Quelle.
_Artikel
Zusätzliche Quellen.
_PScheduleGroup
Das ScheduleGroup
-Objekt, in dem die Weiterleitungsaufgabe für den multitype_join
-Meldungsblock geplant ist. Das verwendete Scheduler
-Objekt wird von der Planungsgruppe impliziert.
Rückgabewert
Ein greedy multitype_join
-Nachrichtenblock mit zwei oder mehr Eingabequellen.
make_join
Erstellt einen non_greedy multitype_join
-Meldungsblock aus einem optionalen Scheduler
oder einer ScheduleGroup
und mindestens zwei Eingabequellen.
template<typename T1, typename T2, typename... Ts>
multitype_join<std::tuple<T1, T2, Ts...>>
make_join(
Scheduler& _PScheduler,
T1 _Item1,
T2 _Item2,
Ts... _Items);
template<typename T1, typename T2, typename... Ts>
multitype_join<std::tuple<T1, T2, Ts...>> make_join(
ScheduleGroup& _PScheduleGroup,
T1 _Item1,
T2 _Item2,
Ts... _Items);
template<typename T1, typename T2, typename... Ts>
multitype_join<std::tuple<T1, T2, Ts...>> make_join(
T1 _Item1,
T2 _Item2,
Ts... _Items);
Parameter
T1
Der Meldungsblocktyp der ersten Quelle.
T2
Der Meldungsblocktyp der zweiten Quelle.
_PScheduler
Das Scheduler
-Objekt, in dem die Weiterleitungsaufgabe für den multitype_join
-Meldungsblock geplant ist.
_Item1
Die erste Quelle.
_Item2
Die zweite Quelle.
_Artikel
Zusätzliche Quellen.
_PScheduleGroup
Das ScheduleGroup
-Objekt, in dem die Weiterleitungsaufgabe für den multitype_join
-Meldungsblock geplant ist. Das verwendete Scheduler
-Objekt wird von der Planungsgruppe impliziert.
Rückgabewert
Ein non_greedy multitype_join
-Nachrichtenblock mit zwei oder mehr Eingabequellen.
make_task
Eine Factorymethode zum Erstellen eines task_handle
-Objekts.
template <class _Function>
task_handle<_Function> make_task(const _Function& _Func);
Parameter
_Funktion
Der Typ des Funktionsobjekts, das aufgerufen wird, um die durch das task_handle
Objekt dargestellte Arbeit auszuführen.
_Func
Die Funktion, die aufgerufen wird, um die durch das task_handle
Objekt dargestellte Arbeit auszuführen. Dies kann ein Lambda-Functor, ein Zeiger auf eine Funktion oder ein Objekt sein, das eine Version des Funktionsaufrufoperators mit der Signatur void operator()()
unterstützt.
Rückgabewert
Ein task_handle
-Objekt.
Hinweise
Diese Funktion ist nützlich, wenn Sie ein task_handle
Objekt mit einem Lambda-Ausdruck erstellen müssen, da es Ihnen ermöglicht, das Objekt zu erstellen, ohne den wahren Typ des Lambda-Functors zu kennen.
parallel_buffered_sort
Ordnet die Elemente in einem angegebenen Bereich in einer nicht absteigenden Reihenfolge oder nach einem durch ein binäres Prädikat angegebenen Sortierkriterium parallel an. Diese Funktion entspricht std::sort
semantisch darin, dass sie eine vergleichsbasierte, instabile, direkte Sortierung ist, abgesehen von den zusätzlich erforderlichen O(n)
-Leerzeichen und er notwendigen Standardinitialisierung für die sortierten Elemente.
template<typename _Random_iterator>
inline void parallel_buffered_sort(
const _Random_iterator& _Begin,
const _Random_iterator& _End);
template<typename _Allocator,
typename _Random_iterator>
inline void parallel_buffered_sort(
const _Random_iterator& _Begin,
const _Random_iterator& _End);
template<typename _Allocator,
typename _Random_iterator>
inline void parallel_buffered_sort(
const _Allocator& _Alloc,
const _Random_iterator& _Begin,
const _Random_iterator& _End);
template<typename _Random_iterator,
typename _Function>
inline void parallel_buffered_sort(
const _Random_iterator& _Begin,
const _Random_iterator& _End,
const _Function& _Func,
const size_t _Chunk_size = 2048);
template<typename _Allocator,
typename _Random_iterator,
typename _Function>
inline void parallel_buffered_sort(
const _Random_iterator& _Begin,
const _Random_iterator& _End,
const _Function& _Func,
const size_t _Chunk_size = 2048);
template<typename _Allocator,
typename _Random_iterator,
typename _Function>
inline void parallel_buffered_sort(
const _Allocator& _Alloc,
const _Random_iterator& _Begin,
const _Random_iterator& _End,
const _Function& _Func,
const size_t _Chunk_size = 2048);
Parameter
_Random_iterator
Der Iteratortyp des Eingabebereichs.
_Verteiler
Der Typ eines mit der C++-Standardbibliothek kompatiblen Speicherzuordnungsservers.
_Funktion
Der Typ des binären Vergleichszeichens.
_Anfangen
Ein zufälliger Eingabeiterator, der die Position des ersten Elements in dem Bereich adressiert, der sortiert werden soll.
_Ende
Ein zufälliger Eingabeiterator, der die Position des ersten Elements direkt hinter dem letzten Element in dem Bereich adressiert, der sortiert werden soll.
_Alloc
Eine Instanz eines mit der C++-Standardbibliothek kompatiblen Speicherzuordnungsservers.
_Func
Ein benutzerdefiniertes Prädikatfunktionsobjekt, das das Vergleichskriterium definiert, das durch aufeinander folgende Elemente in der Sortierung erfüllt werden soll. Ein binäres Prädikat akzeptiert zwei Argumente und gibt bei Erfüllung true
und bei Nichterfüllung false
zurück. Diese Vergleichoperatorfunktion muss eine strikte schwache Sortierung auf Elementenpaare der Sequenz anwenden.
_Chunk_size
Die Mimimumgröße eines Datenblocks, der zur parallelen Ausführung in zwei unterteilt wird.
Hinweise
Alle Überladungen erfordern n * sizeof(T)
zusätzlichen Platz, wobei n
die Anzahl der zu sortierenden Elemente und T
der Elementtyp ist. In den meisten Fällen zeigt parallel_buffered_sort eine Leistungsverbesserung gegenüber parallel_sort an, und Sie sollten sie über parallel_sort verwenden, wenn der Arbeitsspeicher verfügbar ist.
Wenn Sie keinen binären Vergleich std::less
angeben, wird als Standard verwendet, der den Elementtyp zum Bereitstellen des Operators operator<()
erfordert.
Wenn Sie keinen Allocatortyp oder eine Instanz angeben, wird der C++-Standardbibliotheksspeicher-Allocator std::allocator<T>
verwendet, um den Puffer zuzuweisen.
Der Algorithmus dividiert den Eingabebereich in zwei Blöcke und teilt die einzelnen Blöcke für die Ausführung parallel in zwei Teilabschnitte auf. Das optionale Argument _Chunk_size
kann verwendet werden, um für den Algorithmus anzugeben, dass er Blöcke der Größe <_Chunk_size
fortlaufend behandelt.
parallel_for
parallel_for
durchläuft einen Bereich von Indizes und führt bei jeder Iteration parallel eine vom Benutzer bereitgestellte Funktion aus.
template <typename _Index_type, typename _Function, typename _Partitioner>
void parallel_for(
_Index_type first,
_Index_type last,
_Index_type _Step,
const _Function& _Func,
_Partitioner&& _Part);
template <typename _Index_type, typename _Function>
void parallel_for(
_Index_type first,
_Index_type last,
_Index_type _Step,
const _Function& _Func);
template <typename _Index_type, typename _Function>
void parallel_for(
_Index_type first,
_Index_type last,
const _Function& _Func,
const auto_partitioner& _Part = auto_partitioner());
template <typename _Index_type, typename _Function>
void parallel_for(
_Index_type first,
_Index_type last,
const _Function& _Func,
const static_partitioner& _Part);
template <typename _Index_type, typename _Function>
void parallel_for(
_Index_type first,
_Index_type last,
const _Function& _Func,
const simple_partitioner& _Part);
template <typename _Index_type, typename _Function>
void parallel_for(
_Index_type first,
_Index_type last,
const _Function& _Func,
affinity_partitioner& _Part);
Parameter
_Index_type
Der Typ des Indexes, der für die Iteration verwendet wird.
_Funktion
Der Typ der Funktion, die bei jeder Iteration ausgeführt wird.
_Partitionierer
Der Typ des Partitionierers, der zum Partitionieren des angegebenen Bereichs verwendet wird.
first
Der erste Index, der in die Iteration einbezogen werden soll.
last
Der Index, der über den letzten Index hinaus in die Iteration aufgenommen werden soll.
_Schritt
Der Wert, um den beim Durchlaufen von first
zu last
Schritt ausgeführt werden soll. Der Schritt muss positiv sein. invalid_argument wird ausgelöst, wenn der Schritt kleiner als 1 ist.
_Func
Die Funktion, die bei jeder Iteration ausgeführt werden soll. Dies kann ein Lambda-Ausdruck, ein Funktionszeiger oder ein beliebiges Objekt sein, das eine Version des Funktionsaufrufoperators mit der Signatur void operator()(_Index_type)
unterstützt.
_Teil
Ein Verweis auf das Partitionerobjekt. Das Argument kann eine von const
auto_partitioner&
, const
static_partitioner&
, const
simple_partitioner&
oder affinity_partitioner&
Sein, wenn ein affinity_partitioner-Objekt verwendet wird, muss der Verweis ein Nicht-Const l-Wert-Verweis sein, sodass der Algorithmus den Zustand für zukünftige Schleifen speichern kann, um sie wieder zu verwenden.
Hinweise
Weitere Informationen finden Sie unter parallele Algorithmen.
parallel_for_each
parallel_for_each
wendet eine angegebene Funktion parallel auf jedes Element innerhalb eines Bereichs an. Sie entspricht semantisch der for_each
-Funktion im std
-Namespace, außer dass die Iteration über die Elemente parallel ausgeführt wird und die Reihenfolge der Iteration nicht angegeben ist. Das Argument _Func
muss einen Funktionsaufrufoperator in der Form operator()(T)
unterstützen, wobei der Parameter T
der Elementtyp des durchlaufenen Containers ist.
template <typename _Iterator, typename _Function>
void parallel_for_each(
_Iterator first,
_Iterator last,
const _Function& _Func);
template <typename _Iterator, typename _Function, typename _Partitioner>
void parallel_for_each(
_Iterator first,
_Iterator last,
const _Function& _Func,
_Partitioner&& _Part);
Parameter
_Iterator
Der Typ des Iterators, der zum Durchlaufen des Containers verwendet wird.
_Funktion
Der Typ der Funktion, die auf jedes Element innerhalb des Bereichs angewendet wird.
_Partitionierer
first
Ein Iterator, der die Position des ersten Elements angibt, das in parallele Iteration eingeschlossen werden soll.
last
Ein Iterator, der die Position eins hinter dem endgültigen Element angibt, das in parallele Iteration eingeschlossen werden soll.
_Func
Ein benutzerdefiniertes Funktionsobjekt, das auf jedes Element im Bereich angewendet wird.
_Teil
Ein Verweis auf das Partitionerobjekt. Das Argument kann eine von const
auto_partitioner&
, const
static_partitioner&
, const
simple_partitioner&
oder affinity_partitioner&
Sein, wenn ein affinity_partitioner-Objekt verwendet wird, muss der Verweis ein Nicht-Const l-Wert-Verweis sein, sodass der Algorithmus den Zustand für zukünftige Schleifen speichern kann, um sie wieder zu verwenden.
Hinweise
auto_partitioner wird für die Überladung ohne explizite Partitionierung verwendet.
Für Iteratoren, die den zufälligen Zugriff nicht unterstützen, wird nur auto_partitioner unterstützt.
Weitere Informationen finden Sie unter parallele Algorithmen.
parallel_invoke
Führt die als Parameter angegebenen Funktionsobjekte parallel aus, und blockiert, bis die Ausführung beendet ist. Jedes Funktionsobjekt kann ein Lambdaausdruck, ein Zeiger auf eine Funktion oder ein anderes Objekt sein, das den Funktionsaufrufoperator mit der Signatur void operator()()
unterstützt.
template <typename _Function1, typename _Function2>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2);
template <typename _Function1, typename _Function2, typename _Function3>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3);
template <typename _Function1,
typename _Function2,
typename _Function3,
typename _Function4>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3,
const _Function4& _Func4);
template <typename _Function1,
typename _Function2,
typename _Function3,
typename _Function4,
typename _Function5>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3,
const _Function4& _Func4,
const _Function5& _Func5);
template <typename _Function1,
typename _Function2,
typename _Function3,
typename _Function4,
typename _Function5,
typename _Function6>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3,
const _Function4& _Func4,
const _Function5& _Func5,
const _Function6& _Func6);
template <typename _Function1,
typename _Function2,
typename _Function3,
typename _Function4,
typename _Function5,
typename _Function6,
typename _Function7>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3,
const _Function4& _Func4,
const _Function5& _Func5,
const _Function6& _Func6,
const _Function7& _Func7);
template <typename _Function1,
typename _Function2,
typename _Function3,
typename _Function4,
typename _Function5,
typename _Function6,
typename _Function7,
typename _Function8>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3,
const _Function4& _Func4,
const _Function5& _Func5,
const _Function6& _Func6,
const _Function7& _Func7,
const _Function8& _Func8);
template <typename _Function1,
typename _Function2,
typename _Function3,
typename _Function4,
typename _Function5,
typename _Function6,
typename _Function7,
typename _Function8,
typename _Function9>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3,
const _Function4& _Func4,
const _Function5& _Func5,
const _Function6& _Func6,
const _Function7& _Func7,
const _Function8& _Func8,
const _Function9& _Func9);
template <typename _Function1,
typename _Function2,
typename _Function3,
typename _Function4,
typename _Function5,
typename _Function6,
typename _Function7,
typename _Function8,
typename _Function9,
typename _Function10>
void parallel_invoke(
const _Function1& _Func1,
const _Function2& _Func2,
const _Function3& _Func3,
const _Function4& _Func4,
const _Function5& _Func5,
const _Function6& _Func6,
const _Function7& _Func7,
const _Function8& _Func8,
const _Function9& _Func9,
const _Function10& _Func10);
Parameter
_Function1
Der Typ des ersten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function2
Der Typ des zweiten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function3
Der Typ des dritten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function4
Der Typ des vierten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function5
Der Typ des fünften Funktionsobjekts, das parallel ausgeführt werden soll.
_Function6
Der Typ des sechsten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function7
Der Typ des siebten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function8
Der Typ des achten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function9
Der Typ des neunten Funktionsobjekts, das parallel ausgeführt werden soll.
_Function10
Der Typ des zehnten Funktionsobjekts, das parallel ausgeführt werden soll.
_Func1
Das erste Funktionsobjekt, das parallel ausgeführt werden soll.
_Func2
Das zweite Funktionsobjekt, das parallel ausgeführt werden soll.
_Func3
Das dritte Funktionsobjekt, das parallel ausgeführt werden soll.
_Func4
Das vierte Funktionsobjekt, das parallel ausgeführt werden soll.
_Func5
Das fünfte Funktionsobjekt, das parallel ausgeführt werden soll.
_Func6
Das sechste Funktionsobjekt, das parallel ausgeführt werden soll.
_Func7
Das siebte Funktionsobjekt, das parallel ausgeführt werden soll.
_Func8
Das achte Funktionsobjekt, das parallel ausgeführt werden soll.
_Func9
Das neunte Funktionsobjekt, das parallel ausgeführt werden soll.
_Func10
Das zehnte Funktionsobjekt, das parallel ausgeführt werden soll.
Hinweise
Beachten Sie, dass mindestens eines der Funktionsobjekte, die als Parameter bereitgestellt werden, inline im aufrufenden Kontext ausgeführt werden kann.
Wenn mindestens eines der Funktionsobjekte, die als Parameter an diese Funktion übergeben werden, eine Ausnahme auslöst, wählt die Laufzeit eine solche Ausnahme der Auswahl aus und verteilt sie aus dem Aufruf an parallel_invoke
.
Weitere Informationen finden Sie unter parallele Algorithmen.
parallel_radixsort
Ordnet Elemente in einem angegebenen Bereich mithilfe eines Basis-Sortieralgorithmus in einer absteigenden Reihenfolge an. Dies ist eine stabile Sortierfunktion, die eine Projektionsfunktion erfordert, mit der Elemente zur Sortierung in Schlüssel, die ganzen Zahlen ohne Vorzeichen ähneln, projiziert werden können. Standardinitialisierung ist für die zu sortierenden Elemente erforderlich.
template<typename _Random_iterator>
inline void parallel_radixsort(
const _Random_iterator& _Begin,
const _Random_iterator& _End);
template<typename _Allocator, typename _Random_iterator>
inline void parallel_radixsort(
const _Random_iterator& _Begin,
const _Random_iterator& _End);
template<typename _Allocator, typename _Random_iterator>
inline void parallel_radixsort(
const _Allocator& _Alloc,
const _Random_iterator& _Begin,
const _Random_iterator& _End);
template<typename _Random_iterator, typename _Function>
inline void parallel_radixsort(
const _Random_iterator& _Begin,
const _Random_iterator& _End,
const _Function& _Proj_func,
const size_t _Chunk_size = 256* 256);
template<typename _Allocator, typename _Random_iterator,
typename _Function>
inline void parallel_radixsort(
const _Random_iterator& _Begin,
const _Random_iterator& _End,
const _Function& _Proj_func,
const size_t _Chunk_size = 256* 256);
template<typename _Allocator,
typename _Random_iterator,
typename _Function>
inline void parallel_radixsort(
const _Allocator& _Alloc,
const _Random_iterator& _Begin,
const _Random_iterator& _End,
const _Function& _Proj_func,
const size_t _Chunk_size = 256* 256);
Parameter
_Random_iterator
Der Iteratortyp des Eingabebereichs.
_Verteiler
Der Typ eines mit der C++-Standardbibliothek kompatiblen Speicherzuordnungsservers.
_Funktion
Der Typ der Projektionsfunktion.
_Anfangen
Ein zufälliger Eingabeiterator, der die Position des ersten Elements in dem Bereich adressiert, der sortiert werden soll.
_Ende
Ein zufälliger Eingabeiterator, der die Position des ersten Elements direkt hinter dem letzten Element in dem Bereich adressiert, der sortiert werden soll.
_Alloc
Eine Instanz eines mit der C++-Standardbibliothek kompatiblen Speicherzuordnungsservers.
_Proj_func
Ein benutzerdefiniertes Projektionsfunktionsobjekt, das ein Element in einen integralen Wert konvertiert.
_Chunk_size
Die Mimimumgröße eines Datenblocks, der zur parallelen Ausführung in zwei unterteilt wird.
Hinweise
Alle Überladungen erfordern n * sizeof(T)
zusätzlichen Platz, wobei n
die Anzahl der zu sortierenden Elemente und T
der Elementtyp ist. Ein unärer Projektions-Functor mit der Signatur I _Proj_func(T)
ist erforderlich, um einen Schlüssel zurückzugeben, wenn ein Element angegeben wird, wobei T
der Elementtyp und I
ein nicht signierter ganzzahliger Typ ist.
Wenn Sie keine Projektionsfunktion bereitstellen, wird eine Standardprojektionsfunktion, die einfach das Element zurückgibt, für integrale Typen verwendet. Die Funktion kann nicht kompiliert werden, wenn das Element kein integraler Typ ist, wenn keine Projektionsfunktion vorhanden ist.
Wenn Sie keinen Allocatortyp oder eine Instanz angeben, wird der C++-Standardbibliotheksspeicher-Allocator std::allocator<T>
verwendet, um den Puffer zuzuweisen.
Der Algorithmus dividiert den Eingabebereich in zwei Blöcke und teilt die einzelnen Blöcke für die Ausführung parallel in zwei Teilabschnitte auf. Das optionale Argument _Chunk_size
kann verwendet werden, um für den Algorithmus anzugeben, dass er Blöcke der Größe <_Chunk_size
fortlaufend behandelt.
parallel_reduce
Berechnet die Summe aller Elemente in einem angegebenen Bereich, indem aufeinander folgende Teilsummen berechnet werden, oder berechnet das Ergebnis der aufeinander folgenden Teilergebnisse, die auf ähnliche Weise mithilfe eines angegebenen binären Vorgangs (außer Summe) abgerufen werden parallel. parallel_reduce
entspricht std::accumulate
semantisch, außer dass der binäre Vorgang assoziativ sein muss und ein Identitätswert anstelle eines Anfangswerts erforderlich ist.
template<typename _Forward_iterator>
inline typename std::iterator_traits<_Forward_iterator>::value_type parallel_reduce(
_Forward_iterator _Begin,
_Forward_iterator _End,
const typename std::iterator_traits<_Forward_iterator>::value_type& _Identity);
template<typename _Forward_iterator, typename _Sym_reduce_fun>
inline typename std::iterator_traits<_Forward_iterator>::value_type parallel_reduce(
_Forward_iterator _Begin,
_Forward_iterator _End,
const typename std::iterator_traits<_Forward_iterator>::value_type& _Identity,
_Sym_reduce_fun _Sym_fun);
template<typename _Reduce_type,
typename _Forward_iterator,
typename _Range_reduce_fun,
typename _Sym_reduce_fun>
inline _Reduce_type parallel_reduce(
_Forward_iterator _Begin,
_Forward_iterator _End,
const _Reduce_type& _Identity,
const _Range_reduce_fun& _Range_fun,
const _Sym_reduce_fun& _Sym_fun);
Parameter
_Forward_iterator
Der Iteratortyp des Eingabebereichs.
_Sym_reduce_fun
Der Typ der symmetrischen Reduktionsfunktion. Dies muss ein Funktionstyp mit Signatur _Reduce_type _Sym_fun(_Reduce_type, _Reduce_type)
sein, wobei _Reduce_type mit dem Identitätstyp und dem Ergebnistyp der Reduzierung identisch ist. Für die dritte Überladung sollte dies mit dem Ausgabetyp übereinstimmen _Range_reduce_fun
.
_Reduce_type
Der Typ, auf den die Eingabe reduziert wird, was sich vom Eingabeelementtyp unterscheiden kann. Der Rückgabewert und der Identitätswert weist diesen Typ auf.
_Range_reduce_fun
Der Typ der Bereichsreduzierungsfunktion. Dies muss ein Funktionstyp mit Signatur _Reduce_type _Range_fun(_Forward_iterator, _Forward_iterator, _Reduce_type)
sein, _Reduce_type identisch mit dem Identitätstyp und dem Ergebnistyp der Reduktion ist.
_Anfangen
Ein Eingabe-Iterator, der das erste Element im Bereich adressiert, um reduziert zu werden.
_Ende
Ein Eingabe-Iterator, der das Element adressiert, das eine Position über das endgültige Element im Bereich hinausgibt, um reduziert zu werden.
_Identität
Der Identitätswert _Identity
ist vom gleichen Typ wie der Ergebnistyp der Reduktion und auch der value_type
Iterator für die erste und zweite Überladung. Für die dritte Überladung muss der Identitätswert denselben Typ wie der Ergebnistyp der Reduktion aufweisen, kann jedoch vom value_type
Iterator abweichen. Er muss einen geeigneten Wert aufweisen, damit sich der Bereichsreduktionsoperator _Range_fun
verhält, wenn er auf einen Bereich eines einzelnen Typelements value_type
und den Identitätswert angewendet wird, wie ein Typ vom Typ value_type
in den Identitätstyp.
_Sym_fun
Die symmetrische Funktion, die im zweiten Teil der Reduktion verwendet wird. Weitere Informationen finden Sie in den Anmerkungen.
_Range_fun
Die Funktion, die in der ersten Phase der Reduktion verwendet wird. Weitere Informationen finden Sie in den Anmerkungen.
Rückgabewert
Das Ergebnis der Reduktion.
Hinweise
Um eine parallele Reduzierung durchzuführen, teilt die Funktion den Bereich auf der Grundlage der Anzahl der für den zugrunde liegenden Planer verfügbaren Mitarbeiter in Blöcke auf. Die Reduktion erfolgt in zwei Phasen, die erste Phase führt eine Reduktion innerhalb jedes Abschnitts durch, und die zweite Phase führt eine Reduktion zwischen den Teilergebnissen der einzelnen Blöcke durch.
Für die erste Überladung muss der Iterator value_type
T
, derSelbe wie der Identitätswerttyp sowie der Ergebnistyp zur Reduzierung sein. Der Elementtyp T muss den Operator T T::operator + (T)
bereitstellen, um Elemente in jedem Block zu reduzieren. Derselbe Operator wird auch in der zweiten Phase verwendet.
Die zweite Überladung erfordert außerdem, dass der Iterator value_type
mit dem Identitätswerttyp und dem Ergebnistyp zur Reduzierung identisch ist. Der angegebene binäre Operator _Sym_fun
wird in beiden Reduktionsphasen verwendet, wobei der Identitätswert als Anfangswert für die erste Phase verwendet wird.
Für die dritte Überladung muss der Identitätswerttyp mit dem Ergebnistyp der Reduzierung identisch sein, der Iterator value_type
kann sich jedoch von beiden unterscheiden. Die Bereichsreduzierungsfunktion _Range_fun
wird in der ersten Phase mit dem Identitätswert als Anfangswert verwendet, und die binäre Funktion _Sym_reduce_fun
wird in der zweiten Phase auf Subergebnisse angewendet.
parallel_sort
Ordnet die Elemente in einem angegebenen Bereich in einer nicht absteigenden Reihenfolge oder nach einem durch ein binäres Prädikat angegebenen Sortierkriterium parallel an. Diese Funktion entspricht std::sort
semantisch insofern, dass sie eine vergleichsbasierte, instabile, direkte Sortierung ist.
template<typename _Random_iterator>
inline void parallel_sort(
const _Random_iterator& _Begin,
const _Random_iterator& _End);
template<typename _Random_iterator,typename _Function>
inline void parallel_sort(
const _Random_iterator& _Begin,
const _Random_iterator& _End,
const _Function& _Func,
const size_t _Chunk_size = 2048);
Parameter
_Random_iterator
Der Iteratortyp des Eingabebereichs.
_Funktion
Der Typ des Binären Vergleichs-Functors.
_Anfangen
Ein zufälliger Eingabeiterator, der die Position des ersten Elements in dem Bereich adressiert, der sortiert werden soll.
_Ende
Ein zufälliger Eingabeiterator, der die Position des ersten Elements direkt hinter dem letzten Element in dem Bereich adressiert, der sortiert werden soll.
_Func
Ein benutzerdefiniertes Prädikatfunktionsobjekt, das das Vergleichskriterium definiert, das durch aufeinander folgende Elemente in der Sortierung erfüllt werden soll. Ein binäres Prädikat akzeptiert zwei Argumente und gibt bei Erfüllung true
und bei Nichterfüllung false
zurück. Diese Vergleichoperatorfunktion muss eine strikte schwache Sortierung auf Elementenpaare der Sequenz anwenden.
_Chunk_size
Die Mindestgröße eines Datenblocks, der für die parallele Ausführung in zwei unterteilt wird.
Hinweise
Die erste Überladung verwendet den binären Vergleich.std::less
Die zweite überladene Verwendet den bereitgestellten binären Vergleichsator, der die Signatur bool _Func(T, T)
aufweisen sollte, wobei T
der Typ der Elemente im Eingabebereich ist.
Der Algorithmus dividiert den Eingabebereich in zwei Blöcke und teilt die einzelnen Blöcke für die Ausführung parallel in zwei Teilabschnitte auf. Das optionale Argument _Chunk_size
kann verwendet werden, um für den Algorithmus anzugeben, dass er Blöcke der Größe <_Chunk_size
fortlaufend behandelt.
parallel_transform
Wendet ein angegebenes Funktionsobjekt auf jedes Element in einem Quellbereich oder auf ein Elementpaar aus zwei Quellbereichen an und kopiert die Rückgabewerte des Funktionsobjekts parallel in einen Zielbereich. Diese Funktion entspricht semantisch std::transform
.
template <typename _Input_iterator1,
typename _Output_iterator,
typename _Unary_operator>
_Output_iterator parallel_transform(
_Input_iterator1 first1,
_Input_iterator1 last1,
_Output_iterator _Result,
const _Unary_operator& _Unary_op,
const auto_partitioner& _Part = auto_partitioner());
template <typename _Input_iterator1,
typename _Output_iterator,
typename _Unary_operator>
_Output_iterator parallel_transform(
_Input_iterator1 first1,
_Input_iterator1 last1,
_Output_iterator _Result,
const _Unary_operator& _Unary_op,
const static_partitioner& _Part);
template <typename _Input_iterator1,
typename _Output_iterator,
typename _Unary_operator>
_Output_iterator parallel_transform(
_Input_iterator1 first1,
_Input_iterator1 last1,
_Output_iterator _Result,
const _Unary_operator& _Unary_op,
const simple_partitioner& _Part);
template <typename _Input_iterator1,
typename _Output_iterator,
typename _Unary_operator>
_Output_iterator parallel_transform(
_Input_iterator1 first1,
_Input_iterator1 last1,
_Output_iterator _Result,
const _Unary_operator& _Unary_op,
affinity_partitioner& _Part);
template <typename _Input_iterator1,
typename _Input_iterator2,
typename _Output_iterator,
typename _Binary_operator,
typename _Partitioner>
_Output_iterator parallel_transform(
_Input_iterator1 first1,
_Input_iterator1 last1,
_Input_iterator2
first2,
_Output_iterator _Result,
const _Binary_operator& _Binary_op,
_Partitioner&& _Part);
template <typename _Input_iterator1,
typename _Input_iterator2,
typename _Output_iterator,
typename _Binary_operator>
_Output_iterator parallel_transform(
_Input_iterator1 first1,
_Input_iterator1 last1,
_Input_iterator2
first2,
_Output_iterator _Result,
const _Binary_operator& _Binary_op);
Parameter
_Input_iterator1
Der Typ des ersten oder einzigen Eingabe-Iterators.
_Output_iterator
Der Typ des Ausgabeiterators.
_Unary_operator
Der Typ des unären Functors, der für jedes Element im Eingabebereich ausgeführt werden soll.
_Input_iterator2
Der Typ des zweiten Eingabe-Iterators.
_Binary_operator
Der Typ des binären Functors, der paarweise für Elemente aus den beiden Quellbereichen ausgeführt wird.
_Partitionierer
first1
Ein Eingabe-Iterator, der die Position des ersten Elements im ersten oder einzigen Quellbereich adressiert, auf dem ausgeführt werden soll.
letzte 1
Ein Eingabe-Iterator, der die Position eins hinter dem endgültigen Element im ersten oder einzigen Quellbereich angibt, an dem ausgeführt werden soll.
_Ergebnis
Ein Ausgabeiterator, der die Position des ersten Elements im Zielbereich adressiert.
_Unary_op
Ein benutzerdefiniertes unäres Funktionsobjekt, das auf jedes Element im Quellbereich angewendet wird.
_Teil
Ein Verweis auf das Partitionerobjekt. Das Argument kann eine von const
auto_partitioner&
, const
static_partitioner&
, const
simple_partitioner&
oder affinity_partitioner&
Sein, wenn ein affinity_partitioner-Objekt verwendet wird, muss der Verweis ein Nicht-Const l-Wert-Verweis sein, sodass der Algorithmus den Zustand für zukünftige Schleifen speichern kann, um sie wieder zu verwenden.
First2
Ein Eingabeiterator, der die Position des ersten Elements im zweiten Quellbereich adressiert.
_Binary_op
Ein benutzerdefiniertes binäres Funktionsobjekt, das in einer Vorwärtsreihenfolge auf die beiden Quellbereiche gekoppelt angewendet wird.
Rückgabewert
Ein Ausgabeiterator, der die Position direkt hinter dem letzten Element im Zielbereich adressiert, der die vom Funktionsobjekt umgewandelten Ausgabeelemente erhält.
Hinweise
auto_partitioner werden für die Überladungen ohne explizites Partitionierargument verwendet.
Für Iteratoren, die den zufälligen Zugriff nicht unterstützen, wird nur auto_partitioner unterstützt.
Die Überladungen, die das Argument _Unary_op
übernehmen, transformieren den Eingabebereich in den Ausgabebereich, indem der unäre Functor auf jedes Element im Eingabebereich angewendet wird. _Unary_op
muss den Funktionsaufrufoperator mit Signatur operator()(T)
unterstützen, wobei T
es sich um den Werttyp des Bereichs handelt, der durchlaufen wird.
Die Überladungen, die das Argument _Binary_op
verwenden, transformieren zwei Eingabebereiche in den Ausgabebereich, indem der binäre Functor auf ein Element aus dem ersten Eingabebereich und ein Element aus dem zweiten Eingabebereich angewendet wird. _Binary_op
muss den Funktionsaufrufoperator mit Signatur operator()(T, U)
unterstützen, wobei T
es U
sich bei den Werttypen der beiden Eingabe iteratoren handelt.
Weitere Informationen finden Sie unter parallele Algorithmen.
receive
Eine allgemeine Empfangsimplementierung, mit der ein Kontext auf Daten von genau einer Quelle warten und die akzeptierten Werte filtern kann.
template <class T>
T receive(
_Inout_ ISource<T>* _Src,
unsigned int _Timeout = COOPERATIVE_TIMEOUT_INFINITE);
template <class T>
T receive(
_Inout_ ISource<T>* _Src,
typename ITarget<T>::filter_method const& _Filter_proc,
unsigned int _Timeout = COOPERATIVE_TIMEOUT_INFINITE);
template <class T>
T receive(
ISource<T>& _Src,
unsigned int _Timeout = COOPERATIVE_TIMEOUT_INFINITE);
template <class T>
T receive(
ISource<T>& _Src,
typename ITarget<T>::filter_method const& _Filter_proc,
unsigned int _Timeout = COOPERATIVE_TIMEOUT_INFINITE);
Parameter
T
Der Nutzlasttyp.
_Src
Ein Zeiger oder Ein Verweis auf die Quelle, aus der Daten erwartet werden.
_Zeitüberschreitung
Die maximale Zeit, für die die Methode für die Daten in Millisekunden verwendet werden soll.
_Filter_proc
Eine Filterfunktion, die bestimmt, ob Nachrichten akzeptiert werden sollen.
Rückgabewert
Ein Wert aus der Quelle des Nutzlasttyps.
Hinweise
Wenn der Parameter _Timeout
einen anderen Wert als die Konstante COOPERATIVE_TIMEOUT_INFINITE
aufweist, wird die Ausnahme ausgelöst, operation_timed_out ausgelöst wird, wenn die angegebene Zeitspanne abläuft, bevor eine Nachricht empfangen wird. Wenn Sie ein Timeout der Länge Null benötigen, sollten Sie die try_receive-Funktion anstelle eines Timeouts von 0
(Null) verwenden, receive
da es effizienter ist und keine Ausnahmen für Timeouts auslöst.
Weitere Informationen finden Sie unter Message Passing Functions.
run_with_cancellation_token
Führt sofort synchron ein Funktionsobjekt im Kontext eines angegebenen Abbruchtokens aus.
template<typename _Function>
void run_with_cancellation_token(
const _Function& _Func,
cancellation_token _Ct);
Parameter
_Funktion
Der Typ des Funktionsobjekts, das aufgerufen wird.
_Func
Das Funktionsobjekt, das ausgeführt wird. Dieses Objekt muss den Funktionsaufrufoperator mit einer Signatur von void(void) unterstützen.
_Ct
Das Abbruchtoken, das den impliziten Abbruch des Funktionsobjekts steuert. Verwenden Sie cancellation_token::none()
diese Option, wenn die Funktion ohne die Möglichkeit einer impliziten Abbruchfunktion einer übergeordneten Aufgabengruppe ausgeführt werden soll.
Hinweise
Unterbrechungspunkte im Funktionsobjekt werden ausgelöst, wenn der cancellation_token
Vorgang abgebrochen wird. Das explizite Token _Ct
isoliert dies _Func
vom übergeordneten Abbruch, wenn das übergeordnete Element über ein anderes Token oder kein Token verfügt.
Send
Ein synchroner Sendevorgang, der wartet, bis das Ziel die Meldung akzeptiert oder ablehnt.
template <class T>
bool send(_Inout_ ITarget<T>* _Trg, const T& _Data);
template <class T>
bool send(ITarget<T>& _Trg, const T& _Data);
Parameter
T
Der Nutzlasttyp.
_Trg
Ein Zeiger oder Ein Verweis auf das Ziel, an das Daten gesendet werden.
_Daten
Ein Verweis auf die zu sendenden Daten.
Rückgabewert
true
wenn die Nachricht akzeptiert wurde, false
andernfalls.
Hinweise
Weitere Informationen finden Sie unter Message Passing Functions.
set_ambient_scheduler
inline void set_ambient_scheduler(std::shared_ptr<::Concurrency::scheduler_interface> _Scheduler);
Parameter
_Scheduler
Der festzulegende Umgebungsplaner.
set_task_execution_resources
Schränkt die Ausführungsressourcen, die von den internen Arbeitsthreads der Concurrency Runtime verwendet werden, auf den angegebenen Affinitätssatz ein.
Es ist nur gültig, diese Methode vor Erstellung des Ressourcen-Managers oder zwischen der Lebensdauer zweier Ressourcen-Manager aufzurufen. Sie kann mehrmals aufgerufen werden, solange der Ressourcen-Manager zum Zeitpunkt des Aufrufs nicht vorhanden ist. Nachdem eine Affinitätsgrenze eingerichtet wurde, bleibt diese bis zum nächsten gültigen Aufruf der set_task_execution_resources
-Methode bestehen.
Die bereitgestellte Affinitätsmaske muss keine Teilmenge der Prozessaffinitätsmaske sein. Die Prozessaffinität wird bei Bedarf aktualisiert.
void __cdecl set_task_execution_resources(
DWORD_PTR _ProcessAffinityMask);
void __cdecl set_task_execution_resources(
unsigned short count,
PGROUP_AFFINITY _PGroupAffinity);
Parameter
_ProcessAffinityMask
Die Affinitätsmaske, auf die die Concurrency Runtime-Arbeitsthreads beschränkt werden sollen. Verwenden Sie diese Methode für ein System mit mehr als 64 Hardwarethreads nur, wenn Sie die Parallelitätslaufzeit auf eine Teilmenge der aktuellen Prozessorgruppe beschränken möchten. Im Allgemeinen sollten Sie die Version der Methode verwenden, die ein Array von Gruppenaffinitäten als Parameter akzeptiert, um die Affinität auf Computern mit mehr als 64 Hardwarethreads einzuschränken.
count
Die Anzahl der GROUP_AFFINITY
Einträge in dem array, das durch den Parameter _PGroupAffinity
angegeben wird.
_PGroupAffinity
Ein Array von GROUP_AFFINITY
Einträgen.
Hinweise
Die Methode löst eine invalid_operation Ausnahme aus, wenn ein Ressourcen-Manager zum Zeitpunkt des Aufrufs vorhanden ist, und eine invalid_argument Ausnahme, wenn die angegebene Affinität zu einer leeren Gruppe von Ressourcen führt.
Die Version der Methode, die ein Array von Gruppenaffinitäten als Parameter verwendet, sollte nur auf Betriebssystemen mit Version Windows 7 oder höher verwendet werden. Andernfalls wird eine invalid_operation Ausnahme ausgelöst.
Das programmgesteuerte Ändern der Prozessaffinität, nachdem diese Methode aufgerufen wurde, führt nicht dazu, dass der Ressourcen-Manager die Affinität erneut auswertet, auf die sie beschränkt ist. Daher sollten alle Änderungen an der Prozessaffinität vorgenommen werden, bevor diese Methode aufgerufen wird.
swap
Tauscht die Elemente zweier concurrent_vector
-Objekte.
template<typename T, class _Ax>
inline void swap(
concurrent_vector<T, _Ax>& _A,
concurrent_vector<T, _Ax>& _B);
Parameter
T
Der Datentyp der elemente, die in den gleichzeitigen Vektoren gespeichert sind.
_Axt
Der Zuweisungstyp der gleichzeitigen Vektoren.
_Ein
Der gleichzeitige Vektor, dessen Elemente mit denen des gleichzeitigen Vektors _B
ausgetauscht werden sollen.
_B
Der gleichzeitige Vektor, der die zu tauschenden Elemente oder den Vektor bereitstellt, dessen Elemente mit denen des gleichzeitigen Vektors _A
ausgetauscht werden sollen.
Hinweise
Die Vorlagenfunktion ist ein Algorithmus, der auf die Containerklasse concurrent_vector
spezialisiert ist, um die Memberfunktion _A
auszuführen. concurrent_vector::swap( _B
). Hierbei handelt es sich um Instanzen der partiellen Sortierung von Funktionsvorlagen durch den Compiler. Wenn Vorlagenfunktionen so überladen werden, dass die Übereinstimmung der Vorlage mit dem Funktionsaufruf nicht eindeutig ist, wählt der Compiler die spezialisierteste Version der Vorlagenfunktion aus. Die allgemeine Version der Vorlagenfunktion, template <class T> void swap(T&, T&)
in der Algorithmusklasse funktioniert nach Zuordnung und ist ein langsamer Vorgang. Die spezialisierte Version in jedem Container ist viel schneller, da sie mit der internen Darstellung der Containerklasse genutzt werden kann.
Diese Methode ist nicht nebenläufigkeitssicher. Sie müssen sicherstellen, dass keine anderen Threads Vorgänge für einen der gleichzeitigen Vektoren ausführen, wenn Sie diese Methode aufrufen.
task_from_exception
template<typename _TaskType, typename _ExType>
task<_TaskType> task_from_exception(
_ExType _Exception,
const task_options& _TaskOptions = task_options());
Parameter
_TaskType
_ExType
_Ausnahme
_TaskOptions
Rückgabewert
task_from_result
template<typename T>
task<T> task_from_result(
T _Param,
const task_options& _TaskOptions = task_options());
inline task<bool> task_from_result(ool _Param);
inline task<void> task_from_result(
const task_options& _TaskOptions = task_options());
Parameter
T
_Param
_TaskOptions
Rückgabewert
Trace_agents_register_name
Ordnet den angegebenen Namen dem Nachrichtenblock oder dem Agent in der ETW-Ablaufverfolgung zu.
template <class T>
void Trace_agents_register_name(
_Inout_ T* _PObject,
_In_z_ const wchar_t* _Name);
Parameter
T
Der Typ des Objekts. Dies ist in der Regel ein Nachrichtenblock oder ein Agent.
_PObject
Ein Zeiger auf den Nachrichtenblock oder Agent, der in der Ablaufverfolgung benannt wird.
_Name
Der Name für das angegebene Objekt.
try_receive
Eine allgemeine try-receive-Implementierung, mit der ein Kontext Daten von genau einer Quelle suchen und die akzeptierten Werte filtern kann. Wenn die Daten nicht bereit sind, wird die Methode zurückgegeben false
.
template <class T>
bool try_receive(_Inout_ ISource<T>* _Src, T& _value);
template <class T>
bool try_receive(
_Inout_ ISource<T>* _Src,
T& _value,
typename ITarget<T>::filter_method const& _Filter_proc);
template <class T>
bool try_receive(ISource<T>& _Src, T& _value);
template <class T>
bool try_receive(
ISource<T>& _Src,
T& _value,
typename ITarget<T>::filter_method const& _Filter_proc);
Parameter
T
Der Nutzlasttyp
_Src
Ein Zeiger oder Ein Verweis auf die Quelle, aus der Daten erwartet werden.
_Wert
Ein Verweis auf einen Ort, an dem das Ergebnis platziert wird.
_Filter_proc
Eine Filterfunktion, die bestimmt, ob Nachrichten akzeptiert werden sollen.
Rückgabewert
Ein bool
Wert, der angibt, ob eine Nutzlast eingefügt _value
wurde.
Hinweise
Weitere Informationen finden Sie unter Message Passing Functions.
wait
Hält den aktuellen Kontext für eine bestimmte Zeit an.
void __cdecl wait(unsigned int _Milliseconds);
Parameter
_Millisekunden
Die Anzahl der Millisekunden, für die der aktuelle Kontext angehalten werden soll. Wenn der _Milliseconds
Parameter auf den Wert 0
festgelegt ist, sollte der aktuelle Kontext die Ausführung für andere runnable Kontexte liefern, bevor der Vorgang fortgesetzt wird.
Hinweise
Wenn diese Methode für einen Concurrency Runtime-Schedulerkontext aufgerufen wird, findet der Scheduler einen anderen Kontext, der für die zugrunde liegende Ressource ausgeführt werden soll. Da der Zeitplan kooperativ ist, kann dieser Kontext nicht genau nach der angegebenen Anzahl von Millisekunden fortgesetzt werden. Wenn der Zeitplan beschäftigt ist, andere Vorgänge auszuführen, die nicht kooperativ zum Planer führen, kann der Wartezeit unbegrenzt sein.
when_all
Erstellt eine Aufgabe, die erfolgreich abgeschlossen wird, wenn alle als Argumente angegeben Aufgaben erfolgreich abgeschlossen werden.
template <typename _Iterator>
auto when_all(
_Iterator _Begin,
_Iterator _End,
const task_options& _TaskOptions = task_options()) ->
decltype (details::_WhenAllImpl<typename std::iterator_traits<_Iterator>::value_type::result_type,
_Iterator>::_Perform(_TaskOptions, _Begin, _End));
Parameter
_Iterator
Der Typ des Eingabeiterators.
_Anfangen
Die Position des ersten Elements in dem Bereich von Elementen, die mit der resultierenden Aufgabe kombiniert werden sollen.
_Ende
Die Position des ersten Elements hinter dem Bereich von Elementen, die mit der resultierenden Aufgabe kombiniert werden sollen.
_TaskOptions
Das task_options
-Objekt.
Rückgabewert
Eine Aufgabe, die erfolgreich abgeschlossen wird, wenn alle Eingabeaufgaben erfolgreich abgeschlossen wurden. Wenn die Eingabeaufgaben vom Typ T
sind, wird die Ausgabe dieser Funktion task<std::vector<T>>
sein. Wenn die Eingabeaufgaben vom Typ void
sind, ist die Ausgabeaufgabe auch task<void>
.
Hinweise
when_all
ist eine nicht blockierende Funktion, die task
als Ergebnis erzeugt. Im Gegensatz zu task::wait ist es sicher, diese Funktion in einer UWP-App im ASTA -Thread (Application STA) aufzurufen.
Wenn eine der Aufgaben abgebrochen oder eine Ausnahme ausgelöst wird, wird die zurückgegebene Aufgabe frühzeitig abgeschlossen, im abgebrochenen Zustand und die Ausnahme wird ausgelöst, wenn sie "task::get" oder task::wait
in diesem Vorgang aufruft.
Weitere Informationen finden Sie unter Task Parallelism.
when_any
Erstellt eine Aufgabe, die erfolgreich abgeschlossen wird, wenn eine der als Argumente angegeben Aufgaben erfolgreich abgeschlossen wird.
template<typename _Iterator>
auto when_any(
_Iterator _Begin,
_Iterator _End,
const task_options& _TaskOptions = task_options())
-> decltype (
details::_WhenAnyImpl<
typename std::iterator_traits<_Iterator>::value_type::result_type,
_Iterator>::_Perform(_TaskOptions, _Begin, _End));
template<typename _Iterator>
auto when_any(
_Iterator _Begin,
_Iterator _End,
cancellation_token _CancellationToken)
-> decltype (
details::_WhenAnyImpl<
typename std::iterator_traits<_Iterator>::value_type::result_type,
_Iterator>::_Perform(_CancellationToken._GetImplValue(), _Begin, _End));
Parameter
_Iterator
Der Typ des Eingabeiterators.
_Anfangen
Die Position des ersten Elements in dem Bereich von Elementen, die mit der resultierenden Aufgabe kombiniert werden sollen.
_Ende
Die Position des ersten Elements hinter dem Bereich von Elementen, die mit der resultierenden Aufgabe kombiniert werden sollen.
_TaskOptions
_CancellationToken
Das Abbruchtoken, das den Abbruch der zurückgegebenen Aufgabe steuert. Wenn Sie kein Abbruchtoken bereitstellen, erhält die resultierende Aufgabe das Abbruchtoken der Aufgabe, die ihren Abschluss verursacht.
Rückgabewert
Eine Aufgabe, die erfolgreich abgeschlossen ist, wenn eine der Eingabeaufgaben erfolgreich abgeschlossen wurde. Wenn die Eingabeaufgaben vom Typ T
sind, ist die Ausgabe dieser Funktion task<std::pair<T, size_t>>>
, wobei das erste Element des Paares das Ergebnis der letzten Aufgabe ist, und das zweite Element der Index der beendeten Aufgabe. Wenn die Eingabeaufgaben vom Typ void
sind, ist die Ausgabe task<size_t>
, wobei das Ergebnis der Index der abgeschlossenen Aufgabe ist.
Hinweise
when_any
ist eine nicht blockierende Funktion, die task
als Ergebnis erzeugt. Im Gegensatz zu task::wait ist es sicher, diese Funktion in einer UWP-App im ASTA -Thread (Application STA) aufzurufen.
Weitere Informationen finden Sie unter Task Parallelism.