最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

class template
<future>

# std::future(C++11)

    namespace std {
      template <class R>
      class future;
    }

## 概要

`future`は、「別スレッドでの処理完了を待ち、その処理結果を取得する」といった非同期処理を実現するためのクラスであり、`promise`クラスと組み合わせて使用する。`promise`が別スレッドでの処理結果を書き込み、`future`がその結果を読み取る。`promise`と`future`は内部的に同一の共有状態を参照する。これによってスレッド間での値の受け渡しやスレッド間同期を実現する。このクラスは`R&`および`void`の、2つの特殊化を持つ。

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`(destructor)` | デストラクタ | C++11
`operator=` | 代入演算子 | C++11
`share` | `future`オブジェクトを共有する | C++11

### 値の取得

名前 | 説明 | 対応バージョン
--- | --- | ---
`get` | 結果を取得する | C++11

### 状態を確認する関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`valid` | 共有状態を持っているかを確認する | C++11

### 待機

名前 | 説明 | 対応バージョン
--- | --- | ---
`wait` | 処理が完了するまで待機する | C++11
`wait_for` | 相対時間でタイムアウトを指定して、処理が完了するまで待機する | C++11
`wait_until` | 絶対時間でタイムアウトを指定して、処理が完了するまで待機する | C++11

## 例

    #include <iostream>
    #include <future>
    #include <thread>
    #include <utility>

    void calc(std::promise<int> p)
    {
      int sum = 0;
      for (int i = 0; i < 10; ++i) {
        sum += i + 1;
      }

      p.set_value(sum); // 結果値を書き込む
    }

    int main()
    {
      std::promise<int> p;
      std::future<int> f = p.get_future();

      // 別スレッドで計算を行う
      std::thread t(calc, std::move(p));

      // calc()によって書き込まれた結果を取得
      std::cout << f.get() << std::endl;

      t.join();
    }

### 出力

    55

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2012 ✅
  - 2012段階の`std::thread`クラスは、コンストラクタに引数をムーブで渡すことができない。そのため、`promise`オブジェクトはスレッド間の共有オブジェクトにする必要がある。(所有権が曖昧になるため、スタイルとしてはよくない) #737812 - std::thread does not accept std::move

## 参照