最終更新日時: 2026年07月22日 16時08分23秒 (JST)
rotarymars が更新

履歴 編集

function template
<future>

# std::shared_future::wait_until(C++11)

    template <class Clock, class Duration>
    future_status wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;

## 概要

絶対時間でタイムアウトを指定して、処理が完了するまで待機する

## テンプレートパラメータ制約

- `chrono::is_clock_v<Clock>`が`true`であること (C++20)

## 効果

共有状態が遅延状態(`future_status::deferred`)の場合、この関数は何もしない。そうでない場合、`abs_time`で指定された絶対時間の期限まで、共有状態が準備状態(`future_status::ready`)になるのを待機する。

## 戻り値

- `future_status::deferred` ： 共有状態が遅延関数を持っている
- `future_status::ready` ： 共有状態が準備完了になった
- `future_status::timeout` ： `abs_time`で指定された絶対時間内に準備完了にならず、タイムアウトになった

## 例外

- C++14 : 時計クラス、`time_point`クラス、`duration`クラスの構築が例外を送出する場合、この関数はそれらの例外を送出する。

## 例

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

    void calc(std::promise<int> p)
    {
      p.set_value(3); // 結果を書き込む
    }

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

      std::thread t(calc, std::move(p));

      // 結果が書き込まれるまで待機する
      // 3秒でタイムアウト
      namespace chrono = std::chrono;
      chrono::steady_clock::time_point tp = chrono::steady_clock::now();

      std::future_status result = f.wait_until(tp + chrono::seconds(3));
      if (result != std::future_status::timeout) {
        // 結果を取り出す(準備完了しているため、すぐに値を取り出せる)
        std::cout << f.get() << std::endl;
      }
      else {
        std::cout << "timeout" << std::endl;
      }

      t.join();
    }

### 出力

    3

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2012 ✅

## 参照

- LWG Issue 2185. Missing throws clause for `future`/`shared_future::wait_for`/`wait_until`