最終更新日時(UTC): 2025年07月11日 17時16分44秒
Koichi Murase が更新

履歴 編集

function
<future>

# std::promise::get_future(C++11)

    future<R> get_future();

## 概要

結果取得のための`future`オブジェクトを取得する

## 戻り値

`*this`と同じ共有状態を持つ`future<R>`オブジェクトを返す

## 同期操作

この関数の呼び出しでは、以下の呼び出しとのデータ競合は発生しない (C++20)：

- `set_value()`
- `set_exception()`
- `set_value_at_thread_exit()`
- `set_exception_at_thread_exit()`

これは、以下のようなケースをサポートするための規定：

    std::promise<void> p;
    std::thread t{ []{
      p.get_future().wait();
    }};
    p.set_value();
    t.join();

## 例外

この関数は、以下のerror conditionを持つ`future_error` 例外オブジェクトを送出する可能性がある：

- `future_already_retrieved` ： すでにこの関数によって共有状態が作られている
- `no_state` ： `*this`が共有状態を持っていない(`promise`オブジェクトがムーブされると起こりうる)

## 例

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

## 参照

- LWG Issue 2412. `promise::set_value()` and `promise::get_future()` should not race