std::future<T>::wait_until
提供: cppreference.com
template<class Clock, class Duration > std::future_status wait_until(conststd::chrono::time_point<Clock,Duration>& timeout_time )const; | (C++11以上) | |
結果が利用可能になるまで待ちます。 指定された timeout_time
に達するか、結果が利用可能になるか、どちらかが先に発生するまでブロックします。 戻り値は wait_until
が戻った理由を表します。
この関数を呼ぶ前に valid()==false であった場合、動作は未定義です。
目次 |
[編集]引数
timeout_time | - | ブロックする最大時点 |
[編集]戻り値
定数 | 説明 |
future_status::deferred | 結果を計算するための関数はまだ開始されていません |
future_status::ready | 結果は準備完了しています |
future_status::timeout | タイムアウトが経過しました |
[編集]例外
実行中に clock、time_point、または duration によって投げられるあらゆる例外 (標準ライブラリによって提供される clock、time_point、および duration は、例外を投げることはありません)。
[編集]ノート
処理系は呼び出し前に valid ==false であった場合を検出し、エラーコンディション future_errc::no_state を持つ future_error を投げることが推奨されます。
timeout_time
に紐付く時計が使用されます。 単調増加する時計であることは要求されません。 時計が不連続的に調節された場合、この関数の動作について何の保証もありません。 既存の実装は timeout_time
を Clock
から std::chrono::system_clock に変換し、 POSIX の pthread_cond_timedwait に移譲するため、待機はシステム時計の調節を反映しますが、ユーザ提供の Clock
は反映しません。 いずれの場合でも、スケジューリングやリソースの奪い合いによる遅延のため、この関数は timeout_time
に達するまでよりも長くブロックする可能性もあります。
[編集]例
Run this code
#include <iostream>#include <future>#include <thread>#include <chrono> int main(){ std::chrono::system_clock::time_point two_seconds_passed = std::chrono::system_clock::now()+std::chrono::seconds(2); // Make a future that that takes 1 second to completedstd::promise<int> p1;std::future<int> f_completes = p1.get_future();std::thread([](std::promise<int> p1){std::this_thread::sleep_for(std::chrono::seconds(1)); p1.set_value_at_thread_exit(9);}, std::move(p1)).detach(); // Make a future that that takes 5 seconds to completedstd::promise<int> p2;std::future<int> f_times_out = p2.get_future();std::thread([](std::promise<int> p2){std::this_thread::sleep_for(std::chrono::seconds(5)); p2.set_value_at_thread_exit(8);}, std::move(p2)).detach(); std::cout<<"Waiting for 2 seconds..."<<std::endl; if(std::future_status::ready== f_completes.wait_until(two_seconds_passed)){std::cout<<"f_completes: "<< f_completes.get()<<"\n";}else{std::cout<<"f_completes did not complete!\n";} if(std::future_status::ready== f_times_out.wait_until(two_seconds_passed)){std::cout<<"f_times_out: "<< f_times_out.get()<<"\n";}else{std::cout<<"f_times_out did not complete!\n";} std::cout<<"Done!\n";}
出力例:
Waiting for 2 seconds... f_completes: 9 f_times_out did not complete! Done!
[編集]関連項目
結果が利用可能になるのを待ちます (パブリックメンバ関数) | |
結果を待ちます。 指定されたタイムアウト期間が満了するまで利用可能にならなければリターンします (パブリックメンバ関数) |