名前空間
変種
操作

std::future<T>::get

From 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)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
メインテンプレート
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 の場合、動作は未定義です。

目次

[edit] 戻り値

1) 共有状態に格納されている値 v。これは std::move(v) として返されます。
2) 共有状態に値として格納されている参照。
3) (なし)

[edit] 例外

future が参照する共有状態に例外が格納されていた場合(例: std::promise::set_exception() の呼び出しによる)、その例外がスローされます。

[edit] 注記

C++ 標準では、呼び出し前に valid()false であるケースを検出して、エラー条件 std::future_errc::no_state を持つ std::future_error をスローすることを実装に推奨しています。

[edit]

#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

[edit] 不具合報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 2096 C++11 (1) のオーバーロードは、TMoveAssignable であるかどうかをチェックするために必要です。 要求されない

[edit] 関連項目

futureが共有状態を持っているかどうかをチェックします。
(public member function) [編集]
English 日本語 中文(简体) 中文(繁體)