Namensräume
Varianten
Aktionen

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

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
 
 
void make_ready_at_thread_exit( ArgTypes... args );
(seit C++11)

Ruft die gespeicherte Aufgabe auf, als ob durch INVOKE<R>(f, args...), wobei f die gespeicherte Aufgabe ist. Der Rückgabewert der Aufgabe oder eine von ihr ausgelöste Ausnahme wird im gemeinsam genutzten Zustand von *this gespeichert.

Der gemeinsam genutzte Zustand wird erst nach dem Beenden des aktuellen Threads und der Zerstörung aller Objekte mit Thread-lokaler Speicherdauer aktiviert.

Inhalt

[edit] Parameter

args - die Parameter, die bei Aufruf der gespeicherten Aufgabe übergeben werden sollen

[edit] Rückgabewert

(keine)

[edit] Ausnahmen

std::future_error unter den folgenden Fehlerbedingungen

  • Die gespeicherte Aufgabe wurde bereits aufgerufen. Die Fehlerkategorie ist auf promise_already_satisfied gesetzt.
  • *this hat keinen gemeinsamen Zustand. Die Fehlerkategorie ist auf no_state gesetzt.

[edit] Beispiel

#include <chrono>
#include <functional>
#include <future>
#include <iostream>
#include <memory>
#include <thread>
#include <utility>
 
struct ProgramState
{
    std::packaged_task<void()> task;
    std::future<void> future;
    std::thread worker;
};
 
static void worker(std::shared_ptr<ProgramState> state)
{
    state->task.make_ready_at_thread_exit(); // execute task right away
 
    auto status = state->future.wait_for(std::chrono::seconds(0));
    if (status == std::future_status::timeout)
        std::cout << "worker: future is not ready yet\n";
    else
        std::cout << "worker: future is ready\n";
 
    std::cout << "worker: exit\n";
}
 
static std::shared_ptr<ProgramState> create_state()
{
    auto state = std::make_shared<ProgramState>();
    state->task = std::packaged_task<void()>{[]
    {
        std::cout << "task: executed\n";
    }};
    state->future = state->task.get_future();
    state->worker = std::thread{worker, state};
    return state;
}
 
int main()
{
    auto state = create_state();
 
    state->worker.join();
    std::cout << "main: worker finished\n";
 
    auto status = state->future.wait_for(std::chrono::seconds(0));
    if (status == std::future_status::timeout)
        std::cout << "main: future is not ready yet\n";
    else
        std::cout << "main: future is ready\n";
}

Ausgabe

task: executed
worker: future is not ready yet
worker: exit
main: worker finished
main: future is ready

[edit] Siehe auch

führt die Funktion aus
(public member function) [edit]