std::future<T>:: wait_until
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Getting the result | ||||
| State | ||||
|
future::wait_until
|
|
template
<
class
Clock,
class
Duration
>
std:: future_status wait_until ( const std:: chrono :: time_point < Clock,Duration > & timeout_time ) const ; |
(C++11以降) | |
wait_until
は結果が利用可能になるまで待機します。指定された
timeout_time
に達するか、結果が利用可能になるか、いずれか早い方の事象が発生するまでブロックします。戻り値は
wait_until
が戻った理由を示します。
もし将来の結果が async の呼び出し結果であり、遅延評価が使用された場合、この関数は待機せずに即座に返ります。
この関数の呼び出し前に
valid()
が
false
である場合、または
Clock
が
Clock
要件を満たさない場合、動作は未定義です。
std::
chrono
::
is_clock_v
<
Clock
>
が
false
の場合、プログラムは不適格です。
(C++20以降)
目次 |
パラメータ
| timeout_time | - | ブロックする最大時間ポイント |
戻り値
| 定数 | 説明 |
| future_status::deferred | 共有状態は遅延評価を使用した遅延関数を含んでいるため、結果は明示的に要求されたときにのみ計算される |
| future_status::ready | 結果の準備が完了している |
| future_status::timeout | タイムアウトが期限切れとなった |
例外
クロック、time_point、またはdurationの実行中にスローされる例外(標準ライブラリで提供されるクロック、タイムポイント、およびデュレーションは例外をスローしない)。
注記
実装では、呼び出し前に valid ( ) == false の場合を検出し、 std::future_error を future_errc::no_state のエラー条件で送出することが推奨されます。
標準では、
timeout_time
に紐付けられたクロックを使用して時間を計測することが推奨されています。このクロックは単調増加クロックである必要はありません。クロックが不連続に調整された場合のこの関数の動作については保証されませんが、既存の実装では
timeout_time
を
Clock
から
std::chrono::system_clock
に変換し、POSIXの
pthread_cond_timedwait
に委譲するため、システムクロックに対する調整は尊重されますが、ユーザー提供の
Clock
に対する調整は尊重されません。いずれにせよ、スケジューリングやリソース競合による遅延のため、この関数は
timeout_time
が経過した後よりも長く待機する可能性があります。
例
#include <chrono> #include <future> #include <iostream> #include <thread> int main() { std::chrono::system_clock::time_point two_seconds_passed = std::chrono::system_clock::now() + std::chrono::seconds(2); // 1秒で完了するfutureを作成 std::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(); // 5秒で完了するfutureを作成 std::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 << "2秒間待機中..." << 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は完了しませんでした!\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は完了しませんでした!\n"; std::cout << "完了!\n"; }
出力例:
Waiting for 2 seconds... f_completes: 9 f_times_out did not complete! Done!
関連項目
|
結果が利用可能になるまで待機する
(公開メンバ関数) |
|
|
結果を待機し、指定されたタイムアウト期間内に利用できない場合は返る
(公開メンバ関数) |