Namespaces
Variants

std::future<T>:: get

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Haupttemplate
T get ( ) ;
(1) (seit C++11)
std:: future < T & > Spezialisierungen
T & get ( ) ;
(2) (seit C++11)
std:: future < void > Spezialisierung
void get ( ) ;
(3) (seit C++11)

Die get Memberfunktion wartet (durch Aufruf von wait() ), bis der gemeinsame Zustand bereit ist, und ruft dann den im gemeinsamen Zustand gespeicherten Wert ab (falls vorhanden). Unmittelbar nach dem Aufruf dieser Funktion ist valid() false .

Wenn valid() vor dem Aufruf dieser Funktion false ist, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Rückgabewert

1) Der im gemeinsamen Zustand gespeicherte Wert v , als std :: move ( v ) .
2) Die im gemeinsamen Zustand als Wert gespeicherte Referenz.
3) (keine)

Ausnahmen

Wenn eine Ausnahme im gemeinsam genutzten Zustand gespeichert wurde, auf den der Future verweist (z.B. durch einen Aufruf von std::promise::set_exception() ), dann wird diese Ausnahme geworfen.

Hinweise

Der C++-Standard empfiehlt Implementierungen, den Fall zu erkennen, wenn valid() vor dem Aufruf false ist und eine Ausnahme vom Typ std::future_error mit einem Fehlerzustand von std::future_errc::no_state zu werfen.

Beispiel

#include <chrono>
#include <future>
#include <iostream>
#include <string>
#include <thread>
std::string time()
{
    static auto start = std::chrono::steady_clock::now();
    std::chrono::duration<double> d = std::chrono::steady_clock::now() - start;
    return "[" + std::to_string(d.count()) + "s]";
}
int main()
{
    using namespace std::chrono_literals;
    {
        std::cout << time() << " launching thread\n";
        std::future<int> f = std::async(std::launch::async, []
        {
            std::this_thread::sleep_for(1s);
            return 7;
        });
        std::cout << time() << " waiting for the future, f.valid() = "
                  << f.valid() << '\n';
        int n = f.get();
        std::cout << time() << " f.get() returned " << n << ", f.valid() = "
                  << f.valid() << '\n';
    }
    {
        std::cout << time() << " launching thread\n";
        std::future<int> f = std::async(std::launch::async, []
        {
            std::this_thread::sleep_for(1s);
            return true ? throw std::runtime_error("7") : 7;
        });
        std::cout << time() << " waiting for the future, f.valid() = "
                  << f.valid() << '\n';
        try
        {
            int n = f.get();
            std::cout << time() << " f.get() returned " << n
                      << ", f.valid() = " << f.valid() << '\n';
        }
        catch (const std::exception& e)
        {
            std::cout << time() << " caught exception " << e.what()
                      << ", f.valid() = " << f.valid() << '\n';
        }
    }
}

Mögliche Ausgabe:

[0.000004s] launching thread
[0.000461s] waiting for the future, f.valid() = 1
[1.001156s] f.get() returned with 7, f.valid() = 0
[1.001192s] launching thread
[1.001275s] waiting for the future, f.valid() = 1
[2.002356s] caught exception 7, f.valid() = 0

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2096 C++11 Überladung (1) musste prüfen, ob T MoveAssignable ist nicht erforderlich

Siehe auch

prüft, ob das Future einen gemeinsamen Zustand besitzt
(öffentliche Elementfunktion)