名前空間
変種
操作

std::future::get

提供: cppreference.com
< cpp‎ | thread‎ | future
 
 
スレッドサポートライブラリ
スレッド
(C++11)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
 
T get();
(1) (汎用 future テンプレートのみのメンバ)
(C++11以上)
T& get();
(2) (future<T&> テンプレート特殊化のみのメンバ)
(C++11以上)
void get();
(3) (future<void> テンプレート特殊化のみのメンバ)
(C++11以上)

get 関数は future が有効な結果を持つまで待機し、(どのテンプレートが使用されたかによって) それを取得します。 結果の待機のために実質的に wait() を呼びます。

汎用テンプレートと2つのテンプレート特殊化はそれぞれ get のいずれかのバージョンを持ちます。 3つのバージョンの get は戻り値の型が異なるだけです。

この関数を呼ぶ前に valid()false であった場合、動作は未定義です。

共有状態は解放されます。 この関数を呼んだ後、 valid()false になります。

目次

[編集] 引数

(なし)

[編集] 戻り値

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

[編集] 例外

フューチャーが参照している共有状態に例外が格納されていた場合 (例えば std::promise::set_exception() の呼び出しを通して)、その例外が投げられます。

[編集] ノート

処理系は呼び出し前に valid()false であったときにそれを検出し、エラーコンディション std::future_errc::no_state を持つ std::future_error を投げることが推奨されます。

[編集]

#include <thread>
#include <future>
#include <iostream>
#include <string>
#include <chrono>
 
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() << " future.get() returned with " << 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() << " future.get() returned with " << 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] future.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]