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
Modèle principal
T get ( ) ;
(1) (depuis C++11)
std:: future < T & > spécialisations
T & get ( ) ;
(2) (depuis C++11)
std:: future < void > spécialisation
void get ( ) ;
(3) (depuis C++11)

La fonction membre get attend (en appelant wait() ) jusqu'à ce que l'état partagé soit prêt, puis récupère la valeur stockée dans l'état partagé (le cas échéant). Immédiatement après l'appel de cette fonction, valid() est false .

Si valid() est false avant l'appel à cette fonction, le comportement est indéfini.

Table des matières

Valeur de retour

1) La valeur v stockée dans l'état partagé, comme std :: move ( v ) .
2) La référence stockée comme valeur dans l'état partagé.
3) (aucun)

Exceptions

Si une exception a été stockée dans l'état partagé référencé par le futur (par exemple via un appel à std::promise::set_exception() ) alors cette exception sera levée.

Notes

La norme C++ recommande aux implémentations de détecter le cas où valid() est false avant l'appel et de lever une std::future_error avec une condition d'erreur de std::future_errc::no_state .

Exemple

#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() << " lancement du thread\n";
        std::future<int> f = std::async(std::launch::async, []
        {
            std::this_thread::sleep_for(1s);
            return 7;
        });
        std::cout << time() << " attente du future, f.valid() = "
                  << f.valid() << '\n';
        int n = f.get();
        std::cout << time() << " f.get() a retourné " << n << ", f.valid() = "
                  << f.valid() << '\n';
    }
    {
        std::cout << time() << " lancement du 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() << " attente du future, f.valid() = "
                  << f.valid() << '\n';
        try
        {
            int n = f.get();
            std::cout << time() << " f.get() a retourné " << n
                      << ", f.valid() = " << f.valid() << '\n';
        }
        catch (const std::exception& e)
        {
            std::cout << time() << " exception attrapée " << e.what()
                      << ", f.valid() = " << f.valid() << '\n';
        }
    }
}

Sortie possible :

[0.000004s] lancement du thread
[0.000461s] attente du future, f.valid() = 1
[1.001156s] f.get() a retourné 7, f.valid() = 0
[1.001192s] lancement du thread
[1.001275s] attente du future, f.valid() = 1
[2.002356s] exception attrapée 7, f.valid() = 0

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR S'applique à Comportement publié Comportement corrigé
LWG 2096 C++11 la surcharge (1) devait vérifier si T est MoveAssignable non requis

Voir aussi

vérifie si le futur a un état partagé
(fonction membre publique)