Namensräume
Varianten
Aktionen

std::packaged_task

Von cppreference.com
< cpp‎ | thread
 
 
Bibliothek für nebenläufige Programmierung
Threads
(C++11)
(C++20)
this_thread Namespace
(C++11)
(C++11)
(C++11)
Kooperatives Beenden
Gegenseitiger Ausschluss
(C++11)
Allgemeines Sperrungsmanagement
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Bedingungsvariablen
(C++11)
Semaphoren
Latches und Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
packaged_task
(C++11)
(C++11)
(C++11)
Sichere Wiederherstellung
(C++26)
Hazard Pointer
Atomare Typen
(C++11)
(C++20)
Initialisierung von atomaren Typen
(C++11)(veraltet in C++20)
(C++11)(veraltet in C++20)
Speicherordnung
(C++11)(deprecated in C++26)
Freie Funktionen für atomare Operationen
Freie Funktionen für atomare Flags
 
 
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 std::packaged_task ein polymorpher, allokator-sensitiver Container: Das gespeicherte aufrufbare Ziel kann auf dem Heap oder mit einem bereitgestellten Allokator allokiert werden.

(bis C++17)

Inhalt

[edit] Memberfunktionen

konstruiert das Task-Objekt
(öffentliche Memberfunktion) [edit]
destruiert das Task-Objekt
(öffentliche Memberfunktion) [edit]
verschiebt das Task-Objekt
(öffentliche Memberfunktion) [edit]
prüft, ob das Task-Objekt eine gültige Funktion hat
(öffentliche Memberfunktion) [edit]
vertauscht zwei Task-Objekte
(öffentliche Memberfunktion) [edit]
Ergebnis abrufen
gibt ein std::future zurück, das mit dem versprochenen Ergebnis verbunden ist
(öffentliche Memberfunktion) [edit]
Ausführung
führt die Funktion aus
(öffentliche Memberfunktion) [edit]
führt die Funktion aus und stellt sicher, dass das Ergebnis erst bereit ist, wenn der aktuelle Thread beendet wurde
(öffentliche Memberfunktion) [edit]
setzt den Zustand zurück und verwirft alle gespeicherten Ergebnisse früherer Ausführungen
(öffentliche Memberfunktion) [edit]

[edit] Nicht-Member-Funktionen

spezialisiert den Algorithmus std::swap
(Funktionstemplates) [bearbeiten]

[edit] Hilfsklassen

spezialisiert das std::uses_allocator Typ-Trait
(Klassentemplate-Spezialisierung) [bearbeiten]

[edit] Deduktionshilfen (seit C++17)

[edit] Beispiel

#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) [bearbeiten]