命名空间
变体
操作

std::future<T>::get

来自 cppreference.com
< cpp‎ | thread‎ | future
 
 
并发支持库
线程
(C++11)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
协作取消
互斥
(C++11)
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩锁和屏障
(C++20)
(C++20)
期货
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危险指针
原子类型
(C++11)
(C++20)
原子类型初始化
(C++11)(C++20 中已弃用)
(C++11)(C++20 中已弃用)
内存排序
原子操作的自由函数
原子标志的自由函数
 
 
主模板
T get();
(1) (自 C++11)
std::future<T&> 特化
T& get();
(2) (自 C++11)
std::future<void> 特化
void get();
(3) (自 C++11)

get 成员函数等待(通过调用 wait())直到共享状态准备就绪,然后检索存储在共享状态中的值(如果有)。在调用此函数后,valid()false

如果在调用此函数之前 valid()false,则行为未定义。

内容

[编辑] 返回值

1) 存储在共享状态中的值 v,作为 std::move(v)
2) 作为共享状态中的值存储的引用。
3) (无)

[编辑] 异常

如果在期货引用的共享状态中存储了异常(例如,通过调用 std::promise::set_exception()),则将抛出该异常。

[编辑] 说明

C++ 标准建议实现检测 valid() 在调用之前为 false 的情况,并抛出一个 std::future_error,其错误条件为 std::future_errc::no_state

[编辑] 示例

#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';
        }
    }
}

可能的输出

[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

[编辑] 缺陷报告

以下行为更改的缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 发布时的行为 正确行为
LWG 2096 C++11 重载 (1) 需要检查 T 是否 MoveAssignable 不需要

[编辑] 另请参阅

检查期货是否有共享状态
(公共成员函数) [编辑]