最終更新日時: 2026年01月29日 13時22分36秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<future>

# std::promise(C++11)

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

## 概要

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

このクラスは`R&`および`void`の、2つの特殊化を持つ。

テンプレートパラメータ：

- `R` ： 結果値の型

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`(destructor)` | デストラクタ | C++11
`operator=` | 代入演算子 | C++11
`swap` | 他の`promise`オブジェクトと値を入れ替える | C++11

### 結果の取得

名前 | 説明 | 対応バージョン
--- | --- | ---
`get_future` | 結果取得のための`future`オブジェクトを取得する | C++11

### 結果の設定

名前 | 説明 | 対応バージョン
--- | --- | ---
`set_value` | 結果の値を設定する | C++11
`set_exception` | 結果の例外を設定する | C++11

### 遅延通知による結果の設定

名前 | 説明 | 対応バージョン
--- | --- | ---
`set_value_at_thread_exit` | スレッド終了時に結果の値を設定する | C++11
`set_exception_at_thread_exit` | スレッド終了時に結果の例外を設定する | C++11

### 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`swap` | 2つの`promise`オブジェクトを入れ替える | C++11

### その他

名前 | 説明 | 対応バージョン
--- | --- | ---
`uses_allocator` | `promise`による特殊化 | C++11 C++26で削除

## 例

    #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 ✅

## 参照