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
メインテンプレート
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 かどうかをチェックする必要があった 不要

関連項目

共有状態を保持しているかどうかをチェックする
(公開メンバ関数)