std::packaged_task
Von cppreference.com
| Definiert im Header <future> |
||
| template< class > class packaged_task; |
(1) | (seit C++11) (nicht definiert) |
| template< class R, class ...ArgTypes > class packaged_task<R(ArgTypes...)>; |
(2) | (seit C++11) |
Die Klassenvorlage std::packaged_task umschließt jedes Callable-Ziel (Funktion, Lambda-Ausdruck, Bind-Ausdruck oder ein anderer Funktions-Objekt), sodass es asynchron aufgerufen werden kann. Der Rückgabewert oder die ausgelöste Ausnahme wird in einem gemeinsamen Zustand gespeichert, auf den über std::future-Objekte zugegriffen werden kann.
|
Genau wie std::function ist |
(bis C++17) |
Inhalt |
[edit] Memberfunktionen
| konstruiert das Task-Objekt (öffentliche Memberfunktion) | |
| destruiert das Task-Objekt (öffentliche Memberfunktion) | |
| verschiebt das Task-Objekt (öffentliche Memberfunktion) | |
| prüft, ob das Task-Objekt eine gültige Funktion hat (öffentliche Memberfunktion) | |
| vertauscht zwei Task-Objekte (öffentliche Memberfunktion) | |
Ergebnis abrufen | |
| gibt ein std::future zurück, das mit dem versprochenen Ergebnis verbunden ist (öffentliche Memberfunktion) | |
Ausführung | |
| führt die Funktion aus (öffentliche Memberfunktion) | |
| führt die Funktion aus und stellt sicher, dass das Ergebnis erst bereit ist, wenn der aktuelle Thread beendet wurde (öffentliche Memberfunktion) | |
| setzt den Zustand zurück und verwirft alle gespeicherten Ergebnisse früherer Ausführungen (öffentliche Memberfunktion) | |
[edit] Nicht-Member-Funktionen
| spezialisiert den Algorithmus std::swap (Funktionstemplates) |
[edit] Hilfsklassen
| (C++11) (bis C++17) |
spezialisiert das std::uses_allocator Typ-Trait (Klassentemplate-Spezialisierung) |
[edit] Deduktionshilfen (seit C++17)
[edit] Beispiel
Führen Sie diesen Code aus
#include <cmath> #include <functional> #include <future> #include <iostream> #include <thread> // unique function to avoid disambiguating the std::pow overload set int f(int x, int y) { return std::pow(x, y); } void task_lambda() { std::packaged_task<int(int, int)> task([](int a, int b) { return std::pow(a, b); }); std::future<int> result = task.get_future(); task(2, 9); std::cout << "task_lambda:\t" << result.get() << '\n'; } void task_bind() { std::packaged_task<int()> task(std::bind(f, 2, 11)); std::future<int> result = task.get_future(); task(); std::cout << "task_bind:\t" << result.get() << '\n'; } void task_thread() { std::packaged_task<int(int, int)> task(f); std::future<int> result = task.get_future(); std::thread task_td(std::move(task), 2, 10); task_td.join(); std::cout << "task_thread:\t" << result.get() << '\n'; } int main() { task_lambda(); task_bind(); task_thread(); }
Ausgabe
task_lambda: 512 task_bind: 2048 task_thread: 1024
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 3117 | C++17 | Deduktionshilfen für packaged_task fehlten |
hinzugefügt |
[edit] Siehe auch
| (C++11) |
wartet auf einen Wert, der asynchron gesetzt wird (Klassenvorlage) |