Namensräume
Varianten
Aktionen

std::packaged_task<R(Args...)>::packaged_task

Von cppreference.com
 
 
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)
(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
 
 
packaged_task() noexcept;
(1) (seit C++11)
template< class F >
explicit packaged_task( F&& f );
(2) (seit C++11)
template< class F, class Allocator >
explicit packaged_task( std::allocator_arg_t, const Allocator& a, F&& f );
(3) (seit C++11)
(bis C++17)
packaged_task( const packaged_task& ) = delete;
(4) (seit C++11)
packaged_task( packaged_task&& rhs ) noexcept;
(5) (seit C++11)

Erstellt ein neues std::packaged_task Objekt.

1) Konstruiert ein std::packaged_task Objekt ohne Aufgabe und ohne gemeinsam genutzten Zustand.
2,3) Konstruiert ein std::packaged_task Objekt mit einer gespeicherten Aufgabe vom Typ std::decay<F>::type und einem gemeinsam genutzten Zustand. Die gespeicherte Aufgabe wird mit std::forward<F>(f) initialisiert.

Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn std::decay<F>::type nicht derselbe Typ wie std::packaged_task<R(Args...)> ist.

Seien t1, t2, ..., tN Werte der entsprechenden Typen in Args. Wenn INVOKE<R>(f, t1, t2, ..., tN) kein gültiger Ausdruck ist, ist das Programm schlecht formatiert.

(bis C++20)

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::remove_cvref_t<F> nicht derselbe Typ wie std::packaged_task<R(Args...)> ist.

Wenn std::is_invocable_r_v<R, std::decay_t<F>&, Args...> false ist, ist das Programm schlecht formatiert.

(seit C++20)
3) Der Allokator a wird verwendet, um den notwendigen Speicher für die Speicherung der Aufgabe zu allokieren.
4) Der Kopierkonstruktor ist gelöscht, std::packaged_task ist nur verschiebbar.
5) Konstruiert ein std::packaged_task mit dem gemeinsam genutzten Zustand und der Aufgabe, die zuvor von rhs besessen wurden. Dadurch verbleibt rhs ohne gemeinsam genutzten Zustand und mit einer aus dem Zustand entfernten Aufgabe.

Inhalt

[edit] Parameter

f - Das aufrufbare Ziel, das ausgeführt werden soll
a - Der Allokator, der beim Speichern der Aufgabe verwendet werden soll
rhs - Das std::packaged_task Objekt, das verschoben werden soll

[edit] Ausnahmen

2) Alle Ausnahmen, die vom Kopier-/Verschiebekonstruktor von f geworfen werden, und möglicherweise std::bad_alloc, wenn die Allokation fehlschlägt.
3) Alle Ausnahmen, die vom Kopier-/Verschiebekonstruktor von f und von der allocate-Funktion des Allokators geworfen werden, wenn die Speicherallokation fehlschlägt.

[edit] Beispiel

#include <future>
#include <iostream>
#include <thread>
 
int fib(int n)
{
    if (n < 3)
        return 1;
    else
        return fib(n - 1) + fib(n - 2);
}
 
int main()
{
    std::packaged_task<int(int)> fib_task(&fib); 
 
    std::cout << "Starting task\n";
    auto result = fib_task.get_future();
    std::thread t(std::move(fib_task), 42);
 
    std::cout << "Waiting for task to finish..." << std::endl;
    std::cout << result.get() << '\n';
 
    std::cout << "Task complete\n";
    t.join();
}

Ausgabe

Starting task
Waiting for task to finish...
267914296
Task complete

[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 2067 C++11 Der Parametertyp des Kopierkonstruktors war packaged_task& const hinzugefügt
LWG 2097 C++11 Für die Überladungen (2,3) konnte F std::packaged_task<R(Args...)> sein F ist eingeschränkt
LWG 4154 C++11 Überladungen (2,3) berücksichtigten das Decaying nicht Decaying berücksichtigen